prototype代表原型,它是JavaScript内置类型的一个属性,它的值表示了一个类的成员的集合。因为Object类型是所有对象的原型,所以自定义类型对象也包含prototype原型对象。prototype对象允许将一个属性添加到指定的类型对象上。
function Person(){ //使用空构造函数定义Person类 }; Person.prototype.setName = function(pName){ //为Person类添加setName方法 this.name = pName; }; Person.prototype.getName = function(){ //为Person类添加getName方法 return this.name; }
? 使用无类型对象的定义方式指定prototype对象
?
function Person(){ };//使用空构造函数定义Person类 Person.prototype = { //使用无类型对象指定prototype的值 age:20, setName:function(pName){ this.name = pName; }, getName:function(){ return this.name; }, getInfo:function(){ return "I am " + this.name + ".I'm " + this.age + " years old!"; } };
?Person对象的创建过程解释器首先创建一个新对象,然后让this指针指向它;将函数的prototype对象的所有成员都赋给 这个新对象;执行函数体,对这个对象进行初始化操作;返回已创建的对象。
? 继承是面向对象思想中另外一个重要的特征
?继承为软件开发主要带来两方面的好处:
?代码重用
?在一定程度上减少显示类型转换的代码
?JavaScript是一种弱类型语言,本身也没有严格意义上的类的概念,所以它并不包含显示类型转换的语言特征。
?? 共享prototype实现继承-1
?实现继承的主要目的是代码重用,或者说是对象的成员的共享。
?protype原型对象是对象成员的集合,因此可以可以通过共享prototype实现继承
?
ChildObject.prototype = ParentObject.prototype;
?创建Mammal类
?
function Mammal(){ //哺乳动物类定义 this.name = "Mammal";//添加name成员属性 } Mammal.prototype.eat = function(){ //添加eat成员方法 alert(this.name + " is eating!"); }; Mammal.prototype.sound = function(){ //加sound成员方法 alert(this.name + " is sounding....."); };
? 创建Cat类
function Cat(){ //猫类定义 this.name = "Cat";//添加name成员属性 } //通过prototype对象共享实现Cat继承Mammal Cat.prototype = Mammal.prototype; var cat = new Cat(); cat.eat(); cat.sound();
? 重写Cat类的sound方法
?
Cat.prototype.sound = function(){ //重写Mammal类的sound方法 alert(this.name + " is miaowing!") } var m = new Mammal(); m.eat(); m.sound();
??利用共享prototype对象实现JavaScript继承虽然简单,但如果子类重写了父类的方法,父类也会受到影响
?通过复制一份父类prototype对象中的成员集合给子类,这样子类在重写方法时就不会影响到父类了
?
for(var i in Mammal.prototype){ //遍历原型对象中的类成员 Cat.prototype[i] = Mammal.prototype[i];//进行原型复杂 }
?大部分面向对象语言为了定义抽象方法或抽象类都提供了诸如“abstract”、“virtual”等关键字。
?JavaScript语言中虽未提供类似的关键字,但实现抽象的方式却异常简单。
?在JavaScript中,抽象方法是没有被定义、但却被this指针直接引用的方法。(在一种已经说了)
function Shape(){}//创建形状类 //为Shap类添加drawShap方法,注意其中调用了一个未定义的抽象方法 rawShape.prototype.drawShap = function(){ this.draw();//可以当做是一个abstruct }
?创建圆类和正方形类
?
function Circle(){}//创建圆形类 function Square(){}//创建正方形类
?利用反射机制实现圆形类继承形状类、正方形继承形状类
for(var i in Shape.prototype){ Circle.prototype[i] = Shape.prototype[i]; Square.prototype[i] = Shape.prototype[i]; }
?为Circle类和Square类添加draw抽象方法实现
Circle.prototype.draw = function(){ alert("画圆..."); }; Square.prototype.draw = function(){ alert("画正方形..."); };
?测试
var shape1 = new Circle(); var shape2 = new Square(); shape1.drawShap(); shape2.drawShap();
?