Открыть меню    

Наследование в javascript

__proto__

javascript

var animal = {
    eat: true
}

var rabbit = {
    jump: true;
}

// наследование одного объекта от другого
rabbit.__proto__ = animal;
rabbit.eat;  // true

Свойство __proto__ говорит нам: если какое-либо свойство отсутствует в объекте rabbit, то его надо искать в объекте animal.

Не надо путать свойство __proto__ со свойством prototype, это разные вещи. __proto__ совершенно не кросссбраузерно (ff,ch,sf).

Object.create()

Функция JavaScript Object.create ()

Создает объект, который имеет указанный прототип и (необязательно) содержит указанные свойства.

Object.create(prototype, descriptors)

  • prototype Обязательное. Объект для использования в качестве прототипа. Может быть null.
  • descriptors Необязательный параметр. Объект JavaScript, содержащий один или несколько дескрипторов свойств.

javascript

Object.create(animal); // создаст пустой объект с прототипом animal
                       //Object { eat=true}

var rabbit = Object.create(animal); // аналог rabbit.__proto__ = animal;

Object.create() позволяет создавать объекты с нужным прототипом. Отличие Object.create() от __proto__ в том, что Object.create() позволяет создать объект с нужным прототипом, но не может изменить прототип после создания объекта.

prototype

Функцию-конструктор совместно с прототипом называют Классом. Название класса обычно начинается с заглавной буквы.

Наследование в javascript можно реализовать посредством специального свойства prototype.

Более подробно о прототипах:

javascript

// определяем конструктор:
function example_constr(r,t) {
    this.ad = r;
    this.ak = t;
    this.a_method = function (x,y)
    {
        alert(x+y);
    }
}

// объявляем метод (r_method) в прототипе
example_constr.prototype.r_method = function ()
    {
        this.qu =  this.ad - this.ak;
        console.log(this.qu);
    }

// вызываем конструктор и создаем объект example_constr (krot)
var krot = new example_constr(14,15);
// что равнозначно     krot = {ad:14,ak:15}

// функция берется из прототипа
krot.r_method(); // -1 

Расширяем функционал за счет расширения одного прототипа другим

javascript

function Menu(title){
    this.title = title;
}

Menu.prototype.openMenu = function(){
    console.log("Открыть " + this.title);
}

var menu = new Menu("Симпл меню");
menu.openMenu(); // Открыть Симпл меню


function HardMenu(title){
    this.title = title;
}

HardMenu.prototype = Object.create(Menu.prototype);

var hardMenu = new HardMenu("Тяжелое меню");

hardMenu.openMenu(); // Открыть Тяжелое меню

Примечание

  • Свойство prototype всего лишь задаёт __proto__ у новых объектов.

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

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