确定是否从继承的类

时间:2016-11-12 08:20:10

标签: javascript inheritance ecmascript-6

有没有办法确定继承类是否打算在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?

2 个答案:

答案 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




使用return

但是,如果忽略将为您创建的对象(上下文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 的实例中使用属性来指示构造函数是否运行。