迭代构造函数链

时间:2014-09-16 17:28:47

标签: javascript

假设我有这样的事情:

function A() {}

function B() {}
B.prototype = Object.create(A.prototype);

function C() {}
C.prototype = Object.create(B.prototype);

var inst = new C();

我现在可以做inst instanceof C == true,inst instanceof B == true,instanceof C == true。

但我怎么能"迭代"构造函数从C()的实例开始运行,以便它返回函数C(),函数B(),函数A(),然后我可以使用它来实例化另一个实例。

2 个答案:

答案 0 :(得分:3)

您可以通过执行

来迭代原型
for (var o=inst; o!=null; o=Object.getPrototypeOf(o))
    console.log(o);
// {}
// C.prototype
// B.prototype
// A.prototype
// Object.prototype

但是,这只会迭代原型链。没有"构造函数链"。如果要访问构造函数,则在继承时需要对原型进行set the .constructor property

function A() {}

function B() {}
B.prototype = Object.create(A.prototype);
B.prototype.constructor = B;

function C() {}
C.prototype = Object.create(B.prototype);
C.prototype.constructor = C;

var inst = new C();

for (var c=inst.constructor; c!=null; (c=Object.getPrototypeOf(c.prototype)) && (c=c.constructor))
    console.log(c);
// C
// B
// A
// Object

  

然后我可以使用它来实例化另一个实例

您只需知道C,而不是"链"。如果您已正确设置inst.constructor,则可以通过C.prototype.constructor访问它。

但是,从任意构造函数实例化对象可能是个坏主意;你不知道所需的参数。我不知道你actually want to do是什么,但你的要求可能会暗示一个设计缺陷。

答案 1 :(得分:0)

使用对象原型的构造函数属性向上移动链。

例如,在您的代码之后:

 C.prototype.constructor === A

是真的,按原样

  inst.constructor.prototype.constructor === A

......等等。