如何在原型链中找到构造函数的根原型构造函数?

时间:2014-03-14 00:40:33

标签: javascript oop prototype

我有一系列构造函数在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();

所以我可以在不破坏原型链的情况下为构造函数添加功能。结果证明这是非常不直观的。

2 个答案:

答案 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对象,因为它是所有函数的基础构造函数。