ES6 引入了 class 语法,使得创建对象更加简便明了。然而,当使用 class 继承时,有些问题需要注意和处理。
问题一:super 要在 this 之前调用
在使用 class 继承时,在子类的 constructor 中必须先调用 super()
才能使用 this
关键字,否则会抛出错误。
下面是一个例子:
-- -------------------- ---- ------- ----- ------ - ----------------- - --------- - ----- - - ----- --- ------- ------ - ----------------- ------ - -- --------------- ---- ---- ----- ----------- -- ------- ----- ------ --------- ------ -- --------- ---- ------- ----------- ---------- - ------ ------------ - -
解决方法:确保 super()
调用在 this
关键字之前。
class Dog extends Animal { constructor(name, breed) { super(name); this.breed = breed; } }
问题二:覆盖父类方法后无法调用
在子类中重写(覆盖)父类方法时,如果需要在子类方法中调用父类方法,则必须使用 super
关键字进行调用。如果直接使用 this
关键字调用父类方法,则会抛出错误。
下面是一个例子:
-- -------------------- ---- ------- ----- ------ - ------- - ------ --------- - - ----- --- ------- ------ - ------- - ------ ----- - -------------- -- ----------- - - ----- --- - --- ------ ------------------------- -- ----------- ----- --- ------- ------ - ------- - ------ ----- - ------------- -- ---------- ---------- -- --- - -------- - -
解决方法:在子类方法中使用 super
关键字调用父类方法。
class Cat extends Animal { speak() { return 'cat' + super.speak(); } }
问题三:无法将子类实例化为父类
虽然子类继承于父类,但是构造函数不同,子类的实例不能当做父类的实例来使用。即使子类只是添加了一些属性或者方法,也不会被自动继承到父类实例中。
下面是一个例子:
-- -------------------- ---- ------- ----- ------ - ----------------- - --------- - ----- - ------- - ---------------------- - - ----- --- ------- ------ - ----------------- ------ - ------------ ---------- - ------ - - ----- ------ - --- ----------------- ----- --- - --- ---------- ----------- ------------------ ---------- -------- -- ---- --------------- ---------- ----- -- ---- --------------- ---------- -------- -- ---- - -- --- --- ------ ------------------ ---------- ----- -- -----
解决方法:如果需要让子类实例可以转换成父类实例,可以使用 Object.setPrototypeOf() 方法将子类实例的原型设置为父类的实例。
const animal = new Animal('animal'); const dog = new Dog('dog', 'bulldog'); Object.setPrototypeOf(animal, Dog.prototype); console.log(animal instanceof Animal); // false console.log(dog instanceof Dog); // true console.log(dog instanceof Animal); // true - 因为 Dog 继承了 Animal console.log(animal instanceof Dog); // true
总结
使用 ES6 class 继承时,需要注意上述三个问题。要在子类 constructor 中先调用 super() ,要在覆盖父类方法时使用 super ,同时要注意子类实例和父类实例的转换问题。
希望这篇文章能够帮助您更加深入理解 ES6 class 的继承机制,遇到问题也可以及时处理并解决。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65025d6d95b1f8cacdfaa633