2010-07-26 67 views
4

试图更多地了解克罗克福德的原型继承方法,他基本上消除了构造函数,从而消除了原型链的任何实际可能性或利用“超级”的想法。克罗克福德原型继承...没有原型链?没有超级?

mynamespace.object.create = function(o) { 
    function F(){}; 
    F.prototype = o; 
    return new F(); 
}; 

这是基于原型背后的理论吗?

我碰到这个问题的原因是我想用一个init方法创建一个基类,这个方法做了一些常见的jquery的东西(这些方法是为了从一个对象a la自动创建一个jquery插件而设计的)www.alexsexton.com/例如,我不想在我的每个初始方法 this.options = $ .extend({},this.options,options)中重复此操作。

所以我想在基本的初始化中,覆盖我的扩展对象中的init,然后在override中调用this.prototype.init来照顾重复的东西。

object.create部分似乎没有让我以任何方式做到这一点。我在这里错过了什么吗?

回答

9

该技术以原型链为中心,这种类型的继承也被称为差分继承

例如:

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(); 
+0

所以,如果我理解 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

+0

是的,这是有效的。完善! – 2010-07-26 22:47:33

+0

再次感谢@CMS。这帮助我清除了一些最终的蛛网。 – 2010-07-27 16:57:49