Page 169 - 你不知道的JavaScript(上卷)
P. 169
还记得这张图吗,它不仅展示出对象(实例)a1 到 Foo.prototype 的委托关系,还展示出
Bar.prototype 到 Foo.prototype 的委托关系,而后者和类继承很相似,只有箭头的方向不
同。图中由下到上的箭头表明这是委托关联,不是复制操作。
下面这段代码使用的就是典型的“原型风格”:
function Foo(name) {
this.name = name;
}
Foo.prototype.myName = function() {
return this.name;
};
function Bar(name,label) {
Foo.call( this, name );
this.label = label;
}
// 我们创建了一个新的 Bar.prototype 对象并关联到 Foo.prototype
Bar.prototype = Object.create( Foo.prototype );
// 注意!现在没有 Bar.prototype.constructor 了
// 如果你需要这个属性的话可能需要手动修复一下它
Bar.prototype.myLabel = function() {
return this.label;
};
var a = new Bar( "a", "obj a" );
a.myName(); // "a"
a.myLabel(); // "obj a"
如果不明白为什么 this 指向 a 的话,请查看第 2 章。
这段代码的核心部分就是语句 Bar.prototype = Object.create( Foo.prototype )。调用
Object.create(..) 会凭空创建一个“新”对象并把新对象内部的 [[Prototype]] 关联到你
指定的对象(本例中是 Foo.prototype)。
换句话说,这条语句的意思是:“创建一个新的 Bar.prototype 对象并把它关联到 Foo.
prototype”。
声明 function Bar() { .. } 时,和其他函数一样,Bar 会有一个 .prototype 关联到默认的
对象,但是这个对象并不是我们想要的 Foo.prototype。因此我们创建了一个新对象并把
154 | 第 5 章