繁体   English   中英

Crockford Prototypical Inheritance ......没有原型链? 没有超级?

[英]Crockford Prototypical Inheritance… no prototype chain? No super?

试图更多地了解Crockford的原型继承方法,他基本上消除了构造函数,从而消除了原型链或利用“超级”概念的任何现实可能性。

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

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

我遇到这个的原因是我想创建一个带有init方法的基类,该方法执行一些常见的jquery工作(这些方法用于自动从对象创建jquery插件www.alexsexton.com/?p=51 )

作为一个例子,我不想在我的每个init方法中重复这一点this.options = $ .extend({},this.options,options);

所以我希望在基本init中使用它,覆盖扩展对象中的init,然后在覆盖中调用this.prototype.init来处理重复的东西。

object.create片似乎不允许我以任何方式这样做。 我在这里错过了什么吗?

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

例如:

var obj = {};
var obj1 = Object.create(obj);
var obj2 = Object.create(obj1);

obj2的原型链看起来像这样:

--------        --------         ------------------
 obj2 ---> | obj1 | -----> | obj  | -----> | Object.prototype | -----> null
           --------        -------          ------------------

连接上例中对象的箭头是内部[[Prototype]]属性,它构成了原型链。

当您尝试访问属性时,例如在obj2 ,它将沿着原型链上的所有对象进行搜索,直到找到,否则属性访问器将只是产生undefined

尽管有方法可以知道对象的[[Prototype]] ,但super的概念并不存在。

ECMAScript第5版引入了Object.getPrototypeOf方法,例如:

Object.getPrototypeOf(obj2) === obj1; // true

但是,此方法尚未得到广泛支持 (以及标准的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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM