Наследование с использованием цепочки прототипов
Прототип функции – это обычный объект. Отсюда несколько возможностей для копирования его свойств и методов.
Можно воспользоваться следующей методикой.
javascript
function People(){
}
People.prototype.jump = function(){
console.log("jump on "+this.countHand+" hands")
};
function Chinaman(){
this.countHand = 2;
}
Chinaman.prototype = {
jump: People.prototype.jump
};
var chinaman = new Chinaman();
console.log(chinaman instanceof Chinaman); // true
console.log(chinaman instanceof People); // false
console.log(chinaman instanceof Object); // true
chinaman.jump(); // jump on 2 hands
Примечание. Оператор instanceof
используется для проверки, принадлежит ли объект данному типу.
Но это не наследование, а всего лишь копирование. Хотя это работает, но так делать ОШИБКА. Такое наследование подразумевает ручное копирование свойств из прототипа одного объекта (People
) в прототип другого объекта (Chinaman
).
Наследование лучше всего организовать при помощи цепочки прототипов. Итак, чтобы определить объект (тип Chinaman
) как человека (объект тип People
) и т.д. вплоть до Object
лучше всего использовать цепочку прототипов: экземпляр одного объекта используем, как прототип для другого объекта.
javascript
function People(){
this.countHand = 2;
}
People.prototype.jump = function(){
console.log("jump on "+this.countHand+" hands")
};
function Chinaman(){
}
Chinaman.prototype = new People();
var chinaman = new Chinaman();
console.log(chinaman instanceof Chinaman); // true
console.log(chinaman instanceof People); // true
console.log(chinaman instanceof Object); // true
chinaman.jump(); // jump on 2 hands
Этим мы сохраняем цепочку прототипов, поскольку прототип экземпляра Chinaman
будет экземпляром класса People
, у которого присутствует прототип объекта (класса) типа People
и т.д. вплоть до наследования свойств прототипа Object
.
Примечание, в статье слово объект используется как синоним слова класс. Экземпляр объекта это объект от класса, например, chinaman
это экземпляр объекта (класса) Chinaman
.
Наследование основанное на "классах" javascript
Применяется, если мы хотим унаследовать только методы или общие свойства (вынесенные в прототип "класса-родителя"):
// 1. Конструктор Animal
function Animal(name) {
this.name = name;
}
// 1.1. Методы и свойства по умолчанию -- в прототип
Animal.prototype.speed = 0;
Animal.prototype.stop = function() {
this.speed = 0;
alert(this.name + ' стоит');
}
Animal.prototype.run = function(speed) {
this.speed += speed;
alert(this.name + ' бежит, скорость ' + this.speed);
};
// 2. Конструктор Rabbit
function Rabbit(name) {
this.name = name;
}
// 2.1. Наследование
Rabbit.prototype = Object.create(Animal.prototype);
// 2.2. Методы Rabbit
Rabbit.prototype.jump = function() {
this.speed++;
alert(this.name + ' прыгает, скорость ' + this.speed);
}
Больше материалов по наследованию основанному на классах: learn.javascript.ru/class-inheritance
Комментарии к статье