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); //=>...