该技术以原型链为中心,这种类型的继承也被称为差分继承。
例如:
var obj = {};
var obj1 = Object.create(obj);
var obj2 = Object.create(obj1);
的obj2
原型链看起来像这样:
-------- -------- ------------------
obj2 ---> | obj1 | -----> | obj | -----> | Object.prototype | -----> null
-------- ------- ------------------
,在上面的例子中连接对象的箭头是内部[[Prototype]]
属性,和形成原型链。
当您尝试访问的属性,例如在obj2
,它会沿着原型链中的所有对象搜索,直到被发现,否则属性访问器只会产生undefined
超级概念并不存在,虽然有办法知道对象的[[Prototype]]
。
ECMAScript的第五版引入的Object.getPrototypeOf
方法,例如:
Object.getPrototypeOf(obj2) === obj1; // true
然而这种方法是not widely supported yet(与标准Object.create
一起)。
一些实施方式提供通过__proto__
属性访问对象的[[Prototype]]
,例如:
obj2.__proto__ === obj1; // true
但请记住,__proto__
是非标准。
作为ECMAScript 3的一部分的isPrototypeOf
方法允许您知道对象是否在另一个对象的原型链中,例如,:
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();
来源
2010-07-26 22:06:03
CMS
所以,如果我理解 VAR基地= { baseInit :function(){/*...*/} }; var specific = Object.create(base); (); specific.init = function // ... }; var specificInstance = Object.create(specific); 应该可以访问: this.init()&& this.baseInit()? 让我给一个镜头。 – 2010-07-26 22:44:33
是的,这是有效的。完善! – 2010-07-26 22:47:33
再次感谢@CMS。这帮助我清除了一些最终的蛛网。 – 2010-07-27 16:57:49