在阅读《javascript高级程序设计》中的寄生组合式继承的时候,我产生了一个疑问,经过inheritPrototype函数之后,到底是将superType的原型整体复制了一份给subType原型对象,还是真的实现了一个原型链。产生这个问题的原因是:
1 2 3 4 5
| function inheritPrototype(subType,superType){ var prototype = Object(superType.prototype); prototype.constructor = subType; subType.prototype = prototype; }
|
函数中的Object方法看上去像是新创造了一个对象,如果是新创造了一个对象的话,那么subType的原型就指向了一个新对象。还有一种可能就是单纯地使用Object方法(而不是通过构造函数的方式使用Object方法)只是创造了原对象(superType.prototype)的一个引用。
为此,做了一个验证,此验证的目的是检验Object方法作为普通函数调用(而不是构造函数)时的作用:
1 2 3 4
| var Timmy = {name:"Timmy",age:21}; var Timmy1 = Object(Timmy); Timmy1.age = 22; alert(Timmy.age);
|
浏览器显示的结果是22。此结果可以证明prototype与superType.prototype指向的其实是同一个对象。
所以我猜想,
1
| prototype.constructor = subType;
|
这行代码会让superType.prototype.constructor指向subType而不是superType!!!
于是做了以下实验:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| function inheritPrototype(subType,superType){ var prototype = Object(superType.prototype); prototype.constructor = subType; subType.prototype = prototype; } function superType(name){ this.name = name; this.color = ["red","blue","green"]; } superType.prototype.sayName = function(){ alert(this.name); } function subType(name,age){ superType.call(this,name); this.age = age; } inheritPrototype(subType,superType); subType.prototype.sayAge = function(){ alert(this.age); } alert(superType.prototype.constructor);
|
果不其然,浏览器打印的结果是subType的函数声明。该结果证明,superType.prototype.constructor指向了subType。
所以,我认为寄生式组合继承,就是将subType的原型直接指向了superType的原型。原型链的结果可能是不变的,但是原型链的结构与组合继承是不一样的。