JavaScript中的原型机制十分复杂。我们在这里仅仅扫它一眼。要了解关于它的所有细节,你需要花相当的时间来学习本系列的 this与对象原型 的第四到六章。
当你引用一个对象上的属性时,如果这个属性不存在,JavaScript将会自动地使用这个对象的内部原型引用来寻找另外一个对象,在它上面查询你想要的属性。你可以认为它几乎是在属性缺失时的备用对象。
从一个对象到它备用对象的内部原型引用链接发生在这个对象被创建的时候。说明它的最简单的方法是使用称为Object.create(..)
的内建工具。
考虑如下代码:
var foo = {
a: 42
};
// 创建 `bar` 并将它链接到 `foo`
var bar = Object.create( foo );
bar.b = "hello world";
bar.b; // "hello world"
bar.a; // 42 <-- 委托到 `foo`
将对象foo
和bar
以及它们的关系可视化也许会有所帮助:
属性a
实际上不存在于对象bar
上,但是因为bar
被原型链接到foo
,JavaScript自动地退到对象foo
上去寻找a
,而且在这里找到了它。
这种链接看起来是语言的一种奇怪的特性。这种特性最常被使用的方式 —— 我会争辩说这是一种滥用 —— 是用来模拟/模仿“类”机制的“继承”。
使用原型的更自然的方式是一种称为“行为委托”的模式,在这种模式中你有意地将你的被链接的对象设计为可以从一个委托到另一个的部分所需的行为中。
注意: 更多关于原型和行为委托的信息,参见本系列的 this与对象原型 的第四到六章。