JavaScript 子类重写父类方法
- 虽然 JavaScript 没有严格的抽象类和抽象方法的语法,但我们可以通过以下方式去模拟它:
class Animal{
speak(){
throw new Error("子类必须实现这个方法!")
}
}
class Dog extends Animal {
speak() {
console.log("汪汪!");
}
}
const animal = new Animal();
const dog = new Dog();
dog.speak(); // 输出 "汪汪!"
animal.speak(); // 这里会抛出错误
在这个例子中,Animal
类提供了一个模拟的抽象方法,如果直接调用它的 speak
方法会报错提示该方法需要在子类中进行实现。在子类Dog
中,它继承了父类 Animal
, 并重写了它的 speak
方法。
ES6 子类重写父类方法
- 直接使用上述 js 的方式来实现。
- 或可以使用
Symbol
const speak = Symbol();
class Animal {
[speak]() {
throw new Error("子类必须实现这个方法");
}
}
class Dog extends Animal {
speak() {
console.log("汪汪!");
}
}
const animal = new Animal();
const dog = new Dog();
dog.speak(); // 输出 "汪汪!"
animal.speak(); // 这里会报错
animal["speak"](); //这里会抛出错误
注意,在这种语法下,子类的似乎是并没有与父类的方法有任何联系。似乎看起来父类不用要那个Symbol来作闭包函数也行,子类的speak
看起来更像是一个私有函数。
学术不精,如有不对之处,望各路神仙大神多多指点!