Наследование в 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__
у новых объектов.
Комментарии к статье