Открыть меню    

Наследование с использованием цепочки прототипов

Прототип функции – это обычный объект. Отсюда несколько возможностей для копирования его свойств и методов.

Можно воспользоваться следующей методикой.

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

Комментарии к статье

Добавить комментарий