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' ]