原型继承
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 也能正常找到。
优点:函数,属性共享。达到复用的目的。
缺点:每个子类实例没有独有的属性,实例化时不能传递参数。