Skip to content

Instantly share code, notes, and snippets.

@liuanyou
Last active August 11, 2017 08:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save liuanyou/59e885952e2af1181c8747202d47111f to your computer and use it in GitHub Desktop.
Save liuanyou/59e885952e2af1181c8747202d47111f to your computer and use it in GitHub Desktop.
JavaScript - 原型

每个对象都连接到一个原型对象,并且它可以从中继承属性。所有通过对象字面量创建的 对象都连接到Object.prototype,它是JavaScript中的标配对象。

当你创建一个新对象时,你可以选择某个对象作为它的原型。JavaScript提供的实现机制 杂乱而复杂,但其实可以被明显地简化。我们将给Object增加一个create方法。这个方法 创建一个使用原对象作为其原型的新对象。

if (typeof Object.beget !== 'function') {
    Object.create = function (o) {
        var F = function () {};
        F.prototype = o;
        return new F();
    };
}
var stooge = {
    "first-name" : "Jerome",
    "last-name" : "Howard"
};
var another_stooge = Object.create(stooge);

原型连接在更新时是不起作用的。当我们对某个对象做出改变时,不会触及该对象的原型:

another_stooge['first-name'] = 'Harry';
another_stooge['middle-name'] = 'Moses';
another_stooge.nickname = 'Moe';

    原型连接只有在检索值的时候才被用到。如果我们尝试去获取对象的某个属性值,但该对 象没有此属性名,那么JavaScript会试着从原型对象中获取属性值。如果那个原型对象也 没有该属性,那么再从它的原型中寻找,依此类推,直到该过程最后到达终点Object. prototype。如果想要的属性完全不存在于原型链中,那么结果就是undefined值。这个 过程称为委托。

原型关系是一种动态的关系。如果我们添加一个新的属性到原型中,该属性会立即对所有 基于该原型创建的对象可见。

stooge.profession = 'actor';
another_stooge.profession       // 'actor'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment