Памятка о наследовании в JavaScript

Так как все больше приходится удалятся от чистого языка к фреймворкам – решил написать себе памятку по возможным паттернам наследования в JavaScript.

Итак как мы можем наследовать свойства одного объекта в другом. Самый простой способ это сделать apply родительского конструктора в дочернем:

// родительский "класс"
function Menu(id){
}

// дочерний класс
function MenuChild(){
  Menu.apply(this, args); //вызываем конструктор родителя 
  this.open = function(){} // определяем или переопределяем свойства
}

Можно наследовать сразу готовые объекты(а не их конструкторы) используя выстроенное свойство __proto__:

var animal = {"eats": true};
var rabbit = {"jumps": true};
rabbit.__proto__ = animal;
alert(rabbit.eats);

Для браузеров, которые не поддерживают свойство __proto__, можно сделать так:

var animal = {"eats": true};
var rabbit = {"jumps": true};
rabbit = Object.create(animal);
alert(rabbit.eats);

Наследование с использованием свойства prototype:

var animal = {"eats": true};
function Rabbit(){}
Rabbit.prototype = animal;
var rabbit = new Rabbit;
alert(rabbit.eats);

И универсальный вариант наследования через специальную функцию:

function inherit( proto ){
  function F(){}
  F.prototype = proto;
  var object = new F;
  return object;
}