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
操作符的处理将根据它们进行操作。)类基{
}
子类扩展对象{
}
//两个'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 {
}