Javascript 巴贝尔真的没有';如果一个类扩展了对象,你真的不必调用super()?

Javascript 巴贝尔真的没有';如果一个类扩展了对象,你真的不必调用super()?,javascript,babeljs,Javascript,Babeljs,我注意到,如果我是透明的 class Rectangle { a = 1; } 使用stage-0,则生成的代码具有构造函数,但不调用super() 但如果代码更改为: class Rectangle extends Object { a = 1; } 那么传输的代码是: function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: valu

我注意到,如果我是透明的

class Rectangle {
  a = 1;
}
使用stage-0,则生成的代码具有构造函数,但不调用
super()

但如果代码更改为:

class Rectangle extends Object {
  a = 1;
}
那么传输的代码是:

function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }

class Rectangle extends Object {
  constructor(...args) {
    super(...args);

    _defineProperty(this, "a", 1);
  }

}
原始代码的版本1和版本2实际上不一样吗?(所有类都扩展对象)。所以,如果版本1不调用
super()
,看起来对象的构造函数什么都不做,那么版本2也没有理由调用它

原始代码的版本1和版本2实际上不一样吗?(所有类都扩展对象)

不完全是。让我们比较一下:

class Base {
}

的确,
Base.prototype
Sub.prototype
都使用
Object.prototype
作为它们的原型,但这并不意味着它们相同。两个区别:

  • Base
    (构造函数)使用
    对象
    作为其原型
    Sub
    使用
    函数。原型
  • Base
    将在通过
    new
    调用对象时创建该对象
    Sub
    不会,它希望超类构造函数(
    Object
    )会这样做。这就意味着它必须称之为。(对构造函数进行标记,以指示它们是基构造函数还是子类构造函数,
    new
    操作符的处理将根据它们进行操作。)
  • 演示#1(使用ES2015+JavaScript引擎):

    类基{
    }
    子类扩展对象{
    }
    //两个'prototype'属性都继承自'Object.prototype'`
    console.log(Object.getPrototypeOf(Base.prototype)==Object.prototype);
    console.log(Object.getPrototypeOf(Sub.prototype)==Object.prototype);
    //但是构造函数本身继承了不同的东西
    console.log(Object.getPrototypeOf(Base)==Function.prototype);
    
    console.log(Object.getPrototypeOf(Sub)==Object)
    Base.\uuuu-proto\uuuu==Function.prototype
    为true,Sub.\uuuu-proto\uuuu==Function.prototype
    为truetrue@nopole-不在兼容的JavaScript实现上,它不是。运行答案中的代码段。或者使用您的精确代码(尽管最好避免使用
    \uuuu proto\uuuu
    ):@nopole-当然,如果您要转换到ES5,那么所有函数都将
    Function.prototype
    作为其原型。但是您在问题中显示的传输代码仍然使用
    语法,当您使用
    扩展
    时,该语法在子类和基类之间设置继承(因此继承了
    静态
    方法)。
    class Sub extends Object {
    }