在ES6中,我如何拼接原型链?

时间:2018-03-07 10:33:49

标签: javascript ecmascript-6 prototype prototype-chain

如果我有这段代码:

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实例的原型链中?

1 个答案:

答案 0 :(得分:0)

  

我想更新原型链,以便C的新实例可以利用Z

那是不可能的。如果您要插入Z作为B的原型,则继承自B所有也将获得Z属性。这包括所有B和旧C个实例。

要区分它们而不影响旧实例,您需要制作一个全新的BC

如果你还想这样做,请按照以下方式进行:

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();