如何在 JavaScript 中创建抽象基类?
2022-08-30 04:19:59
是否可以在 JavaScript 中模拟抽象基类?最优雅的方法是什么?
比如说,我想做这样的事情: -
var cat = new Animal('cat');
var dog = new Animal('dog');
cat.say();
dog.say();
它应该输出:“树皮”,“喵喵”
是否可以在 JavaScript 中模拟抽象基类?最优雅的方法是什么?
比如说,我想做这样的事情: -
var cat = new Animal('cat');
var dog = new Animal('dog');
cat.say();
dog.say();
它应该输出:“树皮”,“喵喵”
创建抽象类的一种简单方法是:
/**
@constructor
@abstract
*/
var Animal = function() {
if (this.constructor === Animal) {
throw new Error("Can't instantiate abstract class!");
}
// Animal initialization...
};
/**
@abstract
*/
Animal.prototype.say = function() {
throw new Error("Abstract method!");
}
“类”和方法是抽象的。Animal
say
创建实例将引发错误:
new Animal(); // throws
这就是你如何从中“继承”:
var Cat = function() {
Animal.apply(this, arguments);
// Cat initialization...
};
Cat.prototype = Object.create(Animal.prototype);
Cat.prototype.constructor = Cat;
Cat.prototype.say = function() {
console.log('meow');
}
Dog
看起来就像这样。
这就是你的场景是如何发挥作用的:
var cat = new Cat();
var dog = new Dog();
cat.say();
dog.say();
在这里摆动(查看控制台输出)。
根据ES6,你可以使用JavaScript类和继承来完成你需要的东西。
在 ECMAScript 2015 中引入的 JavaScript 类主要是对 JavaScript 现有的基于原型的继承的语法糖。
参考资料: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes
首先,我们定义抽象类。此类不能实例化,但可以扩展。我们还可以定义必须在扩展此类的所有类中实现的函数。
/**
* Abstract Class Animal.
*
* @class Animal
*/
class Animal {
constructor() {
if (this.constructor == Animal) {
throw new Error("Abstract classes can't be instantiated.");
}
}
say() {
throw new Error("Method 'say()' must be implemented.");
}
eat() {
console.log("eating");
}
}
之后,我们可以创建具体的类。这些类将从抽象类继承所有函数和行为。
/**
* Dog.
*
* @class Dog
* @extends {Animal}
*/
class Dog extends Animal {
say() {
console.log("bark");
}
}
/**
* Cat.
*
* @class Cat
* @extends {Animal}
*/
class Cat extends Animal {
say() {
console.log("meow");
}
}
/**
* Horse.
*
* @class Horse
* @extends {Animal}
*/
class Horse extends Animal {}
结果...
// RESULTS
new Dog().eat(); // eating
new Cat().eat(); // eating
new Horse().eat(); // eating
new Dog().say(); // bark
new Cat().say(); // meow
new Horse().say(); // Error: Method say() must be implemented.
new Animal(); // Error: Abstract classes can't be instantiated.