有没有办法确定继承类是否打算在JavaScript中调用super()
?
function A() {
A.prototype.isInitialized = function() {
// what can be checked to see if B bothered to called super()
}
}
class B extends A {
//constructor() {
// didn't call super()
//}
}
假设B没有自己的构造函数。是否只使用A的构造函数,因此默认情况下有效地调用了super?
答案 0 :(得分:3)
是的,没有构造函数与只调用super
的构造函数相同,因此您不必担心有未初始化的父级。
class A {
constructor() {
this.isInit = true
}
isInitialized() {
return !!this.isInit
}
}
class B extends A {
constructor() {
super()
}
}
class C extends A {
}
b = new B()
console.log(b.isInitialized())
c = new C()
console.log(c.isInitialized())
答案 1 :(得分:1)
如果不调用 A 构造函数,则无法创建 B 的实例(除非您不使用该对象)为您创建,并返回另一个对象,请参阅下面的内容)。
如果您没有为类 B 指定构造函数,那么就会为您创建一个看起来像这样的构建函数(在您的情况下没有参数):
constructor(...args) {
super(...args);
}
如果您明确为 B 创建构造函数,并且没有返回对象,那么必须调用其中的super
,否则不会可以创建 B 的实例。以下将产生错误:
function A() {
console.log('hi');
}
class B extends A {
constructor() {
// no call to super is made
}
}
var b = new B(); // Reference Error: `this` is not defined

但是,如果忽略将为您创建的对象(上下文this
),不要引用this
,并返回另一个对象,那么父项的构造函数不会被称为:
function A() {
console.log('hi');
this.isInitialised = true;
}
class B extends A {
constructor() {
return Object.create(B.prototype);
}
}
var b = new B();
console.log(b instanceof B, b instanceof A, b.isInitialised); // true, true, undefined

在这里,我们使用Object.create
创建 B&#39> 原型的实例,该实例是 A 的实例,但是 A&# 39; s 构造函数未执行。请参阅输出以解释结果。
因此,无论您是否在 B 上定义构造函数,在您没有返回对象的所有有效情况下,都会调用 A 的构造函数
在 B&#39> 构造函数中使用return
时,可能会创建一个仍然是 A 的实例的对象,但其构造函数在哪里不叫。您可以在 A 的实例中使用属性来指示构造函数是否运行。