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