在看 Nicholas C. Zakas 写的《深入理解ES6》第198页,关于类的继承中,有下面一段话:
如果不想调用 super()
,则唯一的方法是让类的构造函数返回一个对象。
这里说的返回一个对象是什么意思?是父类的构造函数返回一个对象还是子类的构造函数返回一个对象?
我父类和子类都试过返回一个对象,但是在子类中不调用 super()
依然会报错 Must call super constructor in derived class before accessing 'this' or returning from derived constructor
的错误。
class A {
constructor () {
return {}
}
sayName () {
console.log(this.name)
}
}
class B extends A {
constructor () {
this.name = 'test'
}
}
你既然在看《深入理解ES6》,应该是明白什么是
super()
。super
作为函数调用时,代表父类的构造函数,不过this
指向的子类实例对象。所以如果你在B的constructor
中执行super()
,就相当于执行A.prototype.constructor.call(this)
。如果你想构造个你描述的例子的话应该是这样的:
现在虽然看上去B是继承了A的一个类,但是现在
B
已经起不到构造函数的作用了!你看到child instanceof B
为false。所以这句话的意思其实是:如果想用Class实现类的继承,那么在子类的构造函数中必须使用
super()
。否则你就只能通过让子类构造函数返回一个对象。而一旦你这么做,那么即使子类继承了父类(A.isPrototypeOf(B)
为true),它也起不到构造函数的作用。在es5中实现这一方式的代码是: