Javascript Crockford原型继承。。。没有原型链?没有超级?

Javascript Crockford原型继承。。。没有原型链?没有超级?,javascript,jquery-plugins,Javascript,Jquery Plugins,试图更多地了解Crockford的原型继承方法,通过这种方法,他基本上消除了构造函数,从而消除了原型链或利用“超级”概念的任何实际可能性 这是基于原型背后的理论吗 我遇到这个问题的原因是我想用一个init方法创建一个基类,该方法完成了一些常见的jquery工作(这些方法是为从对象自动创建jquery插件而设计的:www.alexsexton.com/?p=51) 作为一个例子,我不想在我的每一个init方法中重复这一点 this.options=$.extend({},this.options,

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

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

我遇到这个问题的原因是我想用一个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);
Object.getPrototypeOf(obj2) === obj1; // true
obj2
的原型链如下所示:

-------- -------- ------------------ obj2 ---> | obj1 | -----> | obj | -----> | Object.prototype | -----> null -------- ------- ------------------ 但是,此方法是(与标准的
对象.create
一起使用)

一些实现通过
\uu proto\uu
属性提供对对象
[[Prototype]]]
的访问,例如:

obj2.__proto__ === obj1; // true
但是请记住,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu
是非标准的

ECMAScript 3中的
isPrototypeOf
方法允许您知道一个对象是否位于另一个对象的原型链中,例如:

obj1.isPrototypeOf(obj2);             // true
obj.isPrototypeOf(obj2);              // true
Object.prototype.isPrototypeOf(obj2); // true
总之,在prototype链中找到一个属性就可以解析,如果您想避免
\uuuu proto\uuu
对象。getPrototypeOf
(因为第一个是非标准的,而且前者还没有得到广泛支持),我只建议您在基本对象中添加
init
方法的前缀,因此,可以从更具体的实例进行访问,例如:

var base = {
  baseInit: function () { /*...*/ }
};

var specific = Object.create(base);
specific.init = function () {
  //...
  this.baseInit();
  //...
};

specific.init();

所以如果我要理解var base={baseInit:function(){/*…*/};var specific=Object.create(base);specific.init=函数(){/..this.baseInit();/..};var specificInstance=Object.create(特定);然后应该能够访问:this.init()&&this.baseInit()?让我来试一试。但这样就只有两个层次的对象继承了吗?不能一直改名。
var base = {
  baseInit: function () { /*...*/ }
};

var specific = Object.create(base);
specific.init = function () {
  //...
  this.baseInit();
  //...
};

specific.init();