2.7 原型

JavaScript中的原型机制是非常复杂的。这里我们仅仅浅谈一下。你需要花费很多时间来阅读本系列《你不知道的JavaScript(上卷)》第二部分的4~6章,以了解所有细节。

当引用对象的某个属性时,如果这个属性并不存在,那么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及其相互关系:

对象bar上的a属性实际上并不存在,但因为bar是原型链接到foo的,所以JavaScript自动跳入到foo对象上搜索a属性,并且成功找到了。

这种链接看起来像是这个语言的奇怪特性。这个特性最常见的使用(我认为是误用)方式就是模拟/伪装带“继承”关系的“类”机制。

更自然应用原型的方式是被称为“行为委托”的模式,其设计意图是,被链接对象能够将其所需要的行为委托给另外一个对象。

有关原型和行为委托的更多信息,参见本系列《你不知道的JavaScript(上卷)》第二部分的4~6章。