Наследование и классы в JavaScript

В многих языках программирования реализовано наследование. И в JavaScript оно тоже существует. Сперва рассмотрим наследование в прототипном стиле.

Опишем функцию конструктор

function Animal(name, weight, color){

	this.name = name || 'someAnimal';
	this.weight = weight;
	this.color = color;

	//выполним некие действия при инициализации
	console.log(this.name + ' construct animal');
}

//метод запишем в прототип
Animal.prototype.sayName = function(){
	console.log(this.name);
};

Опишем функцию конструктор которая наследуюет класс Animal. И расширим ее, добавим дополнительно собственные свойства и методы

function Mammal(name, weight, color, limbs){
	Animal.apply(this, arguments);
	this.limbs = limbs || 4;
	console.log(this.name + ' construct mammal');
}

Mammal.prototype = Object.create(Animal.prototype);
Mammal.prototype.constructor = Mammal;

Mammal.prototype.run = function(){
	console.log('run');
}

Создадим экземпляры этих классов

var bird = new Animal('bird', 1, 'black');
var cat = new Mammal('Murzik', 2, 'white', 3);

Проверим к какому классу принадлежит объект cat

console.log(cat instanceof Mammal);//true
console.log(cat instanceof Animal);//true
Теперь сделаем почти тоже самое, только воспользуемся синтаксисом ES6. И к тому же рассмотрим статические методы класса.
class Animal {

	constructor(name = 'someAnimal', weight, color){

		this.name = name;
		this.weight = weight;
		this.color = color;

		//выполним некие действия при инициализации
		console.log(this.name + ' construct animal');
	}

	sayName(){
		console.log(this.name);
	}

	//создадим статический метод
	static getEyes(){
		return 2;
	}

}

Опишем класс, который наследует Animal. И добавим дополнительно собственные свойства и методы

class Mammal extends Animal{
	constructor(name, weight, color, limbs = 4){

		//вызовем конструктор родителя
		super(name, weight, color);

		this.limbs = limbs;
		console.log(this.name + ' construct mammal');
	}

	run(){
		console.log('run');
	}
}

Создадим экземпляры этих классов

let bird = new Animal('bird', 1, 'black');
let cat = new Mammal('Murzik', 2, 'white', 3);

Проверим к какому классу принадлежит объект cat

console.log(cat instanceof Mammal); //true
console.log(cat instanceof Animal); //true

Вызовем статический метод getEyes для класса Animal

console.log(Animal.getEyes()); //2

Как видим для описания метода не надо использовать слово function. И конструктор родителя вызывается ключевым словом super. При обращении к this без вызова super() будет ошибка

Share: