ES6 - 构造函数中的超级必需
ES6 - Super required in constructor
class Overflow {}
class Stack extends Overflow {
constructor() {
super();
}
}
let stack = new Stack();
https://plnkr.co/edit/JqRfuDAav9opvapwCGpT?p=preview
如果我使用construtor()
我必须始终调用 super((。
为什么在构造函数中不调用super()
自动?
编辑:super()
在这里调用基础constructor
并设置原型吗?似乎不对。编辑:为什么需要super()
?即使我无意调用基构造函数。
为什么在构造函数中不调用
super()
自动?
因此,您可以决定在构造函数中的哪个位置调用它。这是完全有效的,例如:
constructor(foo) {
let bar;
if (foo) {
bar = /*...*/;
} else {
bar = /*...*/;
}
super(bar);
}
。在调用 super
之前未提供任何代码,则使用 this
(或 super.xyz
(。
是的,本来可以定义语言,如果你在构造函数中根本没有任何调用super
,它会在开始时自动为你添加(a'la Java(,但他们只是决定不这样做。
super()
在这里调用基构造函数并设置原型吗?似乎不对。
不,它调用基构造函数。原型是在调用构造函数之前设置的。就像这个旧的 ES5 代码一样:
function Derived() {
Base.call(this);
}
。在:
function Base() {
}
function Derived() {
Base.call(this);
}
Derived.prototype = Object.create(Base.prototype);
Derived.prototype.constructor = Derived;
为什么需要
super()
?即使我无意调用基构造函数。
如果您无意调用基构造函数,那么您的子类不是子类,也不应该扩展基类。在严格类型的语言中,您可能会使基(或基的子集(成为接口,并让您的类实现它而不是子类化。在 JavaScript 中,没有必要,只要让它像你想要的鸭子一样嘎嘎叫。如果instanceof
关系很重要,请创建一个新的基,它将充当接口,但不在任何地方执行任何操作,并让旧基和你的类直接子类化它。
Axel FTWhttp://www.2ality.com/2015/02/es6-classes-final.html
总结
为什么需要超级?
- 新的关键字
class
不仅仅是语法糖。 - 分配和实例化仅发生在基构造函数中。
但为什么呢?
- 允许异国情调的物体被扩展(谢谢菲利克斯·克林(。
- ES6构造函数返回基类的实例
- ES6类是否与构造函数相同
- 使构造函数参数具有ES6类方法的特权
- ES6 - 构造函数中的超级必需
- ES6类构造函数参数
- 从构造函数es6调用静态方法
- 具有默认参数值的 ES6 类构造函数上的 NodeJS 错误
- 当函数绑定在构造函数中时,如何在 ES6 React 中向事件处理程序添加参数
- Jasmine:如何在ES6上监视导入的函数/构造函数
- 使用 ES5 和 ES6 将输入注入组件构造函数
- 在类构造函数 (ES6) 中定义常量
- Javascript ES6 中的静态构造函数
- 检测构造函数(符号) - ES6
- 如何在es6类构造函数中访问click事件的方法
- 模拟除了Jest中的构造函数之外的整个es6类
- 来自构造函数的 ES6 调用值
- 为什么JavaScript ES6不支持多构造函数类?
- ES6类:我怎么得到这个?属性在基类构造函数中分配给派生类原型
- ES6类构造函数中的解构
- 如何从ES6类中的getter函数返回构造函数参数值