原型继承

function SuperType(){

this.property = true;
}

SuperType.prototype.getSuperValue = function(){

return this.property;

}

function SubType(){

this.subproperty = false;

}

SubType.prototype = new SuperType(); //这里为什么不用 SubType.prototype = SuperType.prototyoe; ? 这样修改子类的构造器constructor,会影响超类constructor仅此而已。 即是超类的原型改变也不会影响继承者的使用,因为超类只是破坏了自己的原型引用而已,子类的原型引用还是之前的原型地址

SubType.prototype.getSubValue = function(){

return this.subproperty;

}

var instance = new SubType();

alert(instance.getSuperValue());  //true

alert(instance.getSubValue());  //false

 

SubType原型prototype 重新定义被实例SuperType 赋值,所有在调用instance.getSuperValue() 方法是,首先搜说SubType 实例中的方法,如果不存在则搜索原型中的方法,即搜索SuperType 实例方法,如果仍没有则搜索SuperType原型中的方法。

 

关于原型被破坏问题

在实例初始化后如果改变原型则实例就找不到原型的方法,但是如果在实例之前则没有影响

function Person(){

}

var p1 = new Person(); // 实例在原型改变前 则p1.sayName()出错

Person.prototype = {

constructor : Person,

name:"Jack",

sayName : function(){

alert(this.name);

}

};

 

var p1 = new Person(); // 实例在原型改变之后,p1.sayName(); //jack

 

p1.sayName();

alert(p1.constructor); //function Person(){}

 

如果在原型中没有指定constructor 则返回Object 

同时即便原型在实例之后改变,定义了constructor 也能正常找到。

 

优点:函数,属性共享。达到复用的目的。

缺点:每个子类实例没有独有的属性,实例化时不能传递参数。

posted @ 2014-12-04 11:45  lcw5945  阅读(106)  评论(0编辑  收藏  举报