如何在 JavaScript 中创建抽象基类?

2022-08-30 04:19:59

是否可以在 JavaScript 中模拟抽象基类?最优雅的方法是什么?

比如说,我想做这样的事情: -

var cat = new Animal('cat');
var dog = new Animal('dog');

cat.say();
dog.say();

它应该输出:“树皮”,“喵喵”


答案 1

创建抽象类的一种简单方法是:

/**
 @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!");
}

“类”和方法是抽象的。Animalsay

创建实例将引发错误:

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();

在这里摆动(查看控制台输出)。


答案 2

JavaScript 类和继承 (ES6)

根据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.