【问题标题】:Ecmascript 6 Class: access constructor created method of super classEcmascript 6 Class:访问超类的构造函数创建方法
【发布时间】:2018-07-09 17:13:07
【问题描述】:

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

现在我从该类继承,并在派生类的构造函数中创建另一个方法,尝试访问它。不幸的是,我得到了一个例外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 检查控制台。我期望的结果是“私有价值,第二私有价值”。

如果有人可以给我一个提示,或者不是超级糟糕的解决方法,我将不胜感激。

谢谢,谢谢

【问题讨论】:

    标签: javascript methods constructor ecmascript-6 overriding


    【解决方案1】:

    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`;
       }
     }
    

    【讨论】:

    • 谢谢!第二种解决方案并不是我真正的选择,因为 _private 并不是真正私有的,您仍然可以通过 getter 公开它。但第一个确实为我做到了。
    猜你喜欢
    • 1970-01-01
    • 2012-10-20
    • 2015-06-02
    • 1970-01-01
    • 2023-01-17
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多