Back
Can we simulate abstract base class in JavaScript? What is the most elegant way to do it?
I want to do something like:
var cat = new Animal('cat');var dog = new Animal('dog');cat.say();dog.say();
var cat = new Animal('cat');
var dog = new Animal('dog');
cat.say();
dog.say();
It should output: ‘bark’,’meow’
You can do it like this:
/** @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!");}
/**
@constructor
@abstract
*/
var Animal = function() {
if (this.constructor === Animal) {
throw new Error("Can't instantiate abstract class!");
}
// Animal initialization...
};
Animal.prototype.say = function() {
throw new Error("Abstract method!");
The Animal “class” and the say method are abstract.
Creating an instance would throw an error:
new Animal();
This is how you “inherit” from it:
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');}
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 just like it.
And this is how your scenario plays out:
var cat = new Cat();var dog = new Dog();cat.say();dog.say();
var cat = new Cat();
var dog = new Dog();
31k questions
32.8k answers
501 comments
693 users