如何为原型链中的构造函数找到根原型构造函数?
How do you find the root prototype constructor for a constructor in a prototype chain?
我有一个使用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();
所以我可以在不破坏原型链的情况下向构造函数添加功能。这是非常不直观的
如果你不设置一个函数的原型,它们有一个循环引用,如F.prototype.constructor === F.那么你想要的函数是:
function getRootConstructor(T){
return T.prototype.constructor === T ? T : getRootConstructor(T.prototype.constructor);
}
在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对象,因为它是所有函数的基本构造函数。
相关文章:
- 如何从构造函数中调用js原型方法
- 通过原型/构造函数从复选框输出值
- Javascript:继承原型而不重新定义构造函数
- 使用sinon.js创建一个“;“间谍对象”;使用基于真实构造函数/原型的间谍方法
- 使用构造函数 - 原型从文本框输出值
- JavaScript原型构造函数只调用过一次
- JavaScript 原型构造函数语法 1 与语法 2
- 构造函数属性值应该是什么 .a 原型构造函数或对象构造函数本身
- 什么是原型?构造函数或其他对象
- 在对象上正确设置原型构造函数
- 重构JavaScript原型构造函数中的重复代码
- 是否需要在经典继承中更改子类的“原型.构造函数”
- 将实例属性放置在原型构造函数中,无论好坏
- javascript原型构造函数和instanceof
- 正在原型构造函数中创建对象引用
- 在javascript的构造函数本身中获取原型构造函数的名称
- 原型构造函数和私有属性的区别
- 为什么原型构造函数中的变量在作为属性访问时未定义
- 如何在 Typescript 中实现无原型构造函数
- 如何为原型链中的构造函数找到根原型构造函数?