原型

每个对象都与对象原型关联,继承了对象原型的属性。

所有对象创建时都从字面量对象({})继承,且都自动链接到的Object.prototype,Object.prototype 来自JavaScript标准。

当JavaScript解释器(在浏览器中一个模块),试图找到一个属性,它要检索,如下面的代码:

var adult = {age: 26},
    retrievedProperty = adult.age;
 // 看上一行

首先,解释器检查对象有的每个属性。例如,adult只有一个自己的属性 - age。但是,除此之外,实际上还有几个属性,这是继承自Object.prototype。

var stringRepresentation = adult.toString();
 // 变量的值为 '[object Object]'

toString 是一个 Object.prototype 的属性, 这是继承。它有一个函数,返回值为一个对象的字符串。如果希望它返回一个更有意义的东西,那么你可以将其覆盖。简单的添加一个属性到adult对象。

adult.toString = function(){
    return "I'm "+this.age;
}

如果现在调用 toString 函数,解释器将发现一个新的对象中的属性然后停止。

解释器解析某个属性时会先检查对象自己,再进一步检查他的原型。

要设置自己的对象为原型而不是默认的Object.prototype,你可以调用以下的Object.create

var child = Object.create(adult);
 /* 通过这种方式创建的对象可以让我们轻松替换默认的Object.prototype成我们想要的。在这里,child的原型是adult对象。
 */
child.age = 8;
 /* 在此之前,child根本没有自己的年龄属性,解释器会寻找child的原型中是否有该属性。现在,当我们设置了child自身年龄,解释器就不深入寻找了。
注意:adult的年龄仍为26。
  */
var stringRepresentation = child.toString();
 // 值为 "I'm 8"。
 /* 注意:我们没覆盖child的toString属性,因此adult类函数不会被调用。如果adult没有toString属性,那么Object.prototype的toString类函数将被调用,我们将得到"[object Object]" 而不是 "I'm 8" 。
 */

child'的原型是adult,其原型为Object.prototype。这一系列原型被称为原型链