jsOopArticleBySorella
Пример работы прототипного наследования на ES5
by spmbt
HTML
<i>(См. вывод консоли.)</i>
JavaScript
// () → String
function get_full_name(){ //возвращает полное имя объекта
return this.first_name + ' ' + this.last_name;
}
// (new_name:String) → undefined
function set_full_name(new_name){ //Вычисляем части имени из полного
var names = new_name.trim().split(/\s+/);
this.first_name = names['0'] ||'';
this.last_name = names['1'] ||'';
}
//===============================================
var person = Object.create(null); //пустой объект ради правильного аргумента
//Впрочем, достаточно и {} --прим.перев.
Object.defineProperty(person, 'name'
,{get: get_full_name // используем предыдущие геттеры/сеттеры
,set: set_full_name
,configurable: true
,enumerable: true});
person.greet = function(person){
return this.name + ': Ну что, привет ' + person + '.';
};
// Присоединяем метод к новому объекту mikhail, добавляя person в [[Prototype]]
var mikhail = Object.create(person);
mikhail.first_name = 'Михаил';
mikhail.last_name = 'Белый';
mikhail.age = 19;
mikhail.gender = 'Male';
//===Тестируем сделанное===:
console.log(mikhail.name); // => 'Михаил Белый' - .name видно за счёт прототипа person
mikhail.name = 'Michael White'; // Присваивание в name должно запустить сеттер
//Теперь first_name и last_name показывают новые значения
console.log(mikhail.first_name); // => 'Michael' - действительно
console.log(mikhail.last_name); // => 'White'
// .greet тоже унаследовано из person.
console.log(mikhail.greet('тебе') ); // => 'Michael White: Ну что, привет тебе.'
// Убедимся, что видим собственные свойства у mikhail
console.log(Object.keys(mikhail) ); // => [ 'first_name', 'last_name', 'age', 'gender' ]