关于寄生组合式继承的思考和验证

在阅读《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的原型。原型链的结果可能是不变的,但是原型链的结构与组合继承是不一样的。

Hello World

很开心,终于有了自己的博客。花了一点时间研究了下hexo。很开心也很激动。
作为一个程序员,此刻我只想:

Hello world!

一个在减肥的蓝胖纸<br><br>阳光正能量小王子<br>…^_^…