我有一系列构造函数在JavaScript中使用原型继承,如下所示:
var Test = function(){};
var Foo = function(){};
var Bar = function(){};
var Baz = function(){};
Bar.prototype = new Baz();
Foo.prototype = new Bar();
Test.prototype = new Foo();
我想编写一个函数getRootConstructor(),以便
getRootConstructor(Test) === Baz.
目标是我能做到
getRootConstructor(Test).prototype = new UniversalBaseConstructor();
所以我可以在不破坏原型链的情况下为构造函数添加功能。结果证明这是非常不直观的。
答案 0 :(得分:2)
如果你没有设置函数的原型,它们有一个循环引用,使得F.prototype.constructor === F.你想要的函数是:
function getRootConstructor(T){
return T.prototype.constructor === T ? T : getRootConstructor(T.prototype.constructor);
}
答案 1 :(得分:1)
在OP中,请注意:
var t = new Test();
t.constructor == Test; // false
t.constructor == Baz; // true
所以基础构造函数由t.constructor
给出。
但是,在构建类似的继承时重新设置(“修复”)构造函数属性是很常见的,这样每个原型的构造函数属性都指向正确的构造函数:
var Test = function(){};
var Foo = function(){};
var Bar = function(){};
var Baz = function(){};
Bar.prototype = new Baz();
Bar.prototype.consructor = Bar;
Foo.prototype = new Bar();
Foo.prototype.constructor = Foo;
Test.prototype = new Foo();
Test.prototype.constructor = Test;
这意味着Brad的 getRootConstructor 函数不起作用,因为Constructor.prototype.constructor
总是指向“真正的”构造函数并且
getRootConstructor(Test) === Test;
在这种情况下,向每个指向原型构造函数的原型添加_super
(或类似命名)属性也很常见,因此可以通过这种方式找到基础构造函数。
请注意,如果Brad的函数确实有效,它将始终返回内置的Function对象,因为它是所有函数的基础构造函数。