Ecmascript 6类:访问构造函数创建的超类

时间:2018-01-30 18:05:56

标签: javascript methods constructor ecmascript-6 override

我在构造函数中创建方法,使用私有值 - 这似乎是创建私有属性并限制对它们的访问的建议模式。

现在我从该类继承并在派生类的构造函数中创建另一个方法,尝试访问它。不幸的是,我得到了例外TypeError: ... is not a function

怎么办?我可以使用构造函数,只是创建一个新对象,但这与它的类无关,复制类和超类等的所有属性似乎很烦人,而不是正确的方式。那又怎么办?

以下是一个例子:

 class ClassA {
constructor() {
        this.getValue = () => "private value";
    }
 }

 class ClassB extends ClassA {
constructor() {
   super();
       this.getValue = () => `${super.getValue()}, second private value`;
    }
 }

 const a = new ClassA();
 const b = new ClassB();

 console.log(`a.getValue = ${a.getValue()}`);
 console.log(`b.getValue = ${b.getValue()}`);

Fiddle检查控制台。我期望的结果是“私人价值,第二私人价值”。

如果有人能给我一个提示,或者不是一个非常糟糕的解决方法,我会很感激。

谢谢,fea

1 个答案:

答案 0 :(得分:0)

super指的是类prototype。由于您的方法不是原型方法而是实例方法,遗憾的是它不起作用。但是,您可以将原始函数引用存储在变量中:

 const orig = this.getValue.bind(this);
this.getValue = () => `${orig()}, second private value`;

但我个人更喜欢_模式:

 class ClassA {
    constructor() {
        this._private = "test";
    }
    getValue(){ return this._private; }
 }

class ClassB extends ClassA {
   constructor() {
      super();
   }

   getValue(){
     return `${super.getValue()}, second private value`;
   }
 }