该技术以原型链为中心,这种继承也称为差分继承。
例如:
var obj = {};
var obj1 = Object.create(obj);
var obj2 = Object.create(obj1);
obj2 的原型链如下所示:
-------- -------- ------------------
obj2 ---> |对象1 | -----> |对象 | -----> | Object.prototype | -----> 空
-------- -------- ------------------
上例中连接对象的箭头是内部[[Prototype]]属性,它构成了原型链。
当你尝试访问一个属性时,例如obj2,它将沿着原型链上的所有对象搜索直到找到,否则属性访问器将简单地产生undefined
super 的概念并不真正存在,尽管有办法知道对象的[[Prototype]]。
ECMAScript 5th Edition 引入了Object.getPrototypeOf 方法,例如:
Object.getPrototypeOf(obj2) === obj1; // true
但是这个方法是not widely supported yet(以及标准的Object.create)。
一些实现通过__proto__ 属性提供对对象的[[Prototype]] 的访问,例如:
obj2.__proto__ === obj1; // true
但请记住,__proto__ 是非标准的。
isPrototypeOf 方法是 ECMAScript 3 的一部分,可让您知道一个对象是否在另一个对象的原型链中,例如:
obj1.isPrototypeOf(obj2); // true
obj.isPrototypeOf(obj2); // true
Object.prototype.isPrototypeOf(obj2); // true
总之,只要在原型链中找到一个属性就会被解析,如果你想避免__proto__和Object.getPrototypeOf(因为第一个是非标准的,前者尚未得到广泛支持),我只是建议您在基础对象中为您的 init 方法添加前缀,以便可以从更具体的实例中访问它,例如:
var base = {
baseInit: function () { /*...*/ }
};
var specific = Object.create(base);
specific.init = function () {
//...
this.baseInit();
//...
};
specific.init();