jsOopArticleBySorella3
Пример 3 работы прототипного наследования на ES5: примеси
by spmbt
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 + '.'
};
var mikhail = Object.create(person);
mikhail.first_name = 'Михаил';
mikhail.last_name = 'Белый';
mikhail.age = 19;
mikhail.gender = 'Male';
var kristin = Object.create(person); //новый персонаж
kristin.first_name = 'Кристина';
kristin.last_name = 'Белая';
kristin.age = 19;
kristin.gender = 'Female';
//---
var descriptor = Object.getOwnPropertyDescriptor //сокращения
,properties = Object.getOwnPropertyNames
,define_prop = Object.defineProperty;
//(target:Object, source:Object) → Object
function extend(target, source){ //копируем свойства source в target
properties(source).forEach(function(key){
define_prop(target, key, descriptor(source, key)) });
return target;
}
//=====================================
var pianist = Object.create(null); //pianist - тот, кто может .play() на пианино
pianist.play = function(){
return this.name + ' начинает играть на пианино.';
};
var singer = Object.create(null); //singer - тот, кто может .sing()
singer.sing = function(){
return this.name + ' начинает петь.';
};
extend(mikhail, pianist); //добавляем возможности конечным объектам - примесь пианиста
console.log(mikhail.play() ); // => 'Михаил Белый начинает играть на пианино.'
// смотрим собственные, неунаследованные свойства у...