【问题标题】:Calling super() inside constructor of JavaScript ES6 class which extends Object在扩展 Object 的 JavaScript ES6 类的构造函数中调用 super()
【发布时间】:2017-07-13 17:23:50
【问题描述】:

在下文中,我试图创建一个 Object 的子类,它的行为类似于 Object 在使用“new”创建实例方面的行为。我当然会向我的子类添加更多方法,但下面显示了我从构造函数中调用超级构造函数的问题。

为什么我的 Sub 类的实例没有像普通 Object 那样的字段“x”,当以相同的方式创建时,使用具有相同参数的“new”?

class Sub extends Object
{ constructor (anObject)
  { super(anObject);
  }
}
var ob  = new Object ({x: 123} );
var sub = new Sub    ({x: 123} );
console.log( ob.x ); // -> 123
console.log( sub.x); // -> undefined

【问题讨论】:

    标签: javascript es6-class


    【解决方案1】:

    基本上,因为Object 是特殊的,并且遵循不同的规则,因为它几乎是 JavaScript 中最基本的构造。

    不要扩展Object,只需在没有超类的情况下创建它(因为无论如何它都会是一个对象)并使用Object.assign(this, obj) 将所有属性分配给新创建的对象。

    class Sub {
      constructor(obj) {
        Object.assign(this, obj);
      }
    }
    
    console.log(new Object({a: 1}));
    console.log(new Sub({a: 1}));

    【讨论】:

    • 我同意“对象是特殊的”,但我认为它应该是特殊的,因为如果其他类不添加自己的行为,它们应该继承它的行为。我仍然想知道这是否实际上是实现中的一个错误,发生在 Node v8.0.0 上。有谁知道规范是否真的在某处说它应该如何工作?谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 2018-02-06
    • 2014-04-18
    • 1970-01-01
    • 2018-09-26
    • 2019-11-17
    • 2020-01-29
    相关资源
    最近更新 更多