如果我有这段代码:
class Z { foo () {return 'from Z';} }
class A { foo () {return 'from A';} }
class B extends A { }
class C extends B { }
var c = new C();
我知道我可以通过这种方式获得原型链:
consonle.log(c.foo());
var obj = c;
while(Object.getPrototypeOf(obj)) {
obj = Object.getPrototypeOf(obj);
console.log(obj);
}
// Puts out:
// from A
// C {}
// B {}
// A {}
// {}
如何在A {}
和B {}
之间的原型链中插入Z的实例,以便相同的脚本输出以下内容?
// from Z
// C {}
// B {}
// Z {}
// A {}
// {}
更新
为了澄清,我想更新原型链,以便C的新实例可以利用Z的.foo()
方法。
更新2
好的,我可以接受,这是不可能的。如何将特定的Z实例拼接到特定C实例的原型链中?
答案 0 :(得分:0)
我想更新原型链,以便C的新实例可以利用Z
那是不可能的。如果您要插入Z
作为B
的原型,则继承自B
的所有也将获得Z
属性。这包括所有B
和旧C
个实例。
要区分它们而不影响旧实例,您需要制作一个全新的B
和C
。
如果你还想这样做,请按照以下方式进行:
class A { foo () {return 'from A';} }
class B extends A { }
class C extends B { }
// Oops, B should inherit from Z not A:
class Z extends A { foo () {return 'from Z';} }
Object.setPrototypeOf(B, Z);
Object.setPrototypeOf(B.prototype, Z.prototype);
var c = new C();