jsOopArticleBySorella2

Пример 2 работы прототипного наследования на ES5: переопределение свойств при наследовании объектов

by spmbt

HTML

<h4>Переопределение свойств при наследовании объектов</h4>

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:String) → String
person.greet = function(person){ //общее формальное приветствие от персонажа
    return this.name + ': Здравствуйте' + (person ?', '+ person :'') +'!';
};
var mikhail = Object.create(person);
  mikhail.first_name = 'Михаил';
  mikhail.last_name = 'Белый';
  mikhail.age = 19;
  mikhail.gender = 'Male';
//вспомним про индивидуальность Михаила:
//(person:String) → String
mikhail.greet = function(person){ //индивидуальное панибратское приветствие
    return this.name + ': Здорово'+ (person ?', '+ person :', братан') +'!';
};
var kristin = Object.create(person); //новый персонаж
  kristin.first_name = 'Кристина';
  kristin.last_name = 'Белая';
  kristin.age = 19;
  kristin.gender = 'Female';
//(У неё другая манера приветствия)

// (person:String) → String
kristin.greet = function(person){ //индивидуальное эмоциональное приветствие
    return this.name + ': Чмоки, ' + (person ||'парниша');
};
//===Проверим, как это всё работает===

console.log(mikhail.greet(kristin.first_name) ); //=> 'Михаил Белый: Здорово, Кристина!'

console.log(mikhail.greet() ); //=> 'Михаил Белый: Здорово, братан!'

console.log(kristin.greet(mikhail.first_name) ); //=> 'Кристина Белая: Чмоки, Михаил'

//пользуясь прототипом kristin, вернём Кристине стандартное поведение:
console.log('Удаление свойства: ', delete kristin.greet); //=>...