假设我有这样的事情:
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(),然后我可以使用它来实例化另一个实例。
答案 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
......等等。