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() ); // => 'Михаил Белый начинает играть на пианино.'

// смотрим собственные, неунаследованные свойства у...