Bob*_*ryn 4 javascript jquery-plugins
试图更多地了解Crockford的原型继承方法,他基本上消除了构造函数,从而消除了原型链或利用"超级"概念的任何现实可能性.
mynamespace.object.create = function( o ) {
function F(){};
F.prototype = o;
return new F();
};
Run Code Online (Sandbox Code Playgroud)
这是故意基于原型背后的理论吗?
我遇到这个的原因是我想用一个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);
Run Code Online (Sandbox Code Playgroud)
obj2看起来像这样的原型链:
-------- -------- ------------------
obj2 ---> | obj1 | -----> | obj | -----> | Object.prototype | -----> null
-------- ------- ------------------
连接上例中对象的箭头是内部[[Prototype]]属性,它构成了原型链.
当您尝试访问某个属性时,例如在中obj2,它将沿着原型链上的所有对象进行搜索,直到找到,否则属性访问者将只是屈服undefined
超级的概念并不存在,尽管有方法可以知道[[Prototype]]对象.
ECMAScript第5版介绍了该Object.getPrototypeOf方法,例如:
Object.getPrototypeOf(obj2) === obj1; // true
Run Code Online (Sandbox Code Playgroud)
然而,这种方法尚未得到广泛支持(与标准一起Object.create).
某些实现[[Prototype]]通过__proto__属性提供对对象的访问,例如:
obj2.__proto__ === obj1; // true
Run Code Online (Sandbox Code Playgroud)
但请记住,这__proto__是非标准的.
该isPrototypeOf方法是ECMAScript 3的一部分,允许您知道对象是否在另一个对象的原型链中,例如:
obj1.isPrototypeOf(obj2); // true
obj.isPrototypeOf(obj2); // true
Object.prototype.isPrototypeOf(obj2); // true
Run Code Online (Sandbox Code Playgroud)
总之,一个属性在原型链中很快得到解决,如果你想避免__proto__和Object.getPrototypeOf(因为第一个是非标准的,前者还没有被广泛支持),我只是建议你为你的init方法添加前缀在基础对象中,因此可以从更具体的实例访问它,例如:
var base = {
baseInit: function () { /*...*/ }
};
var specific = Object.create(base);
specific.init = function () {
//...
this.baseInit();
//...
};
specific.init();
Run Code Online (Sandbox Code Playgroud)