class Overflow {}
class Stack extends Overflow {
constructor() {
super();
}
}
let stack = new Stack();
https://plnkr.co/edit/JqRfuDAav9opvapwCGpT?p=preview
如果我使用construtor()
,必须调用super()始终。
为什么在构造函数中没有自动调用super()
?
修改:此处super()
是否正在调用基础constructor
AND 设置原型?似乎错了。
编辑:为什么需要super()
?即使我无意调用基础构造函数。
答案 0 :(得分:2)
为什么在构造函数中没有自动调用
super()
?
因此,您可以在构造函数中决定 where 来调用它。这完全有效,例如:
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
关系很重要,请创建一个新的基础,它将充当接口,但不会在任何地方执行任何操作,并使旧基础和类直接将其子类化。
答案 1 :(得分:1)
Axel FTW http://www.2ality.com/2015/02/es6-classes-final.html
为什么需要超级?
class
不仅仅是语法糖。但是为什么呢?