jsOopArticleBySorella4

Пример 4 работы прототипного наследования на ES5: доступ к экранированным методам предков

by spmbt

HTML

<h4>Доступ к экранированным методам предков</h4>

JavaScript

//(object:Object, fun:Function) → Function
function make_method(object, fun){ //сохранение места объявления в методе при наследовании
  return function(){ var args;
    args = [].slice.call(arguments);
    args.unshift(object); //вставить 'object' первым аргументом
    fun.apply(this, args);
  };
}
//Все методы будут содержать в первом аргументе объект
// (прототип) их объявления (конечно, теперь нигде
//нельзя использовать позиционный доступ к аргументам - только по имени)
function message(self, message){ var proto;
  proto = Object.getPrototypeOf(self);
  if(proto && proto.log)
    proto.log.call(this, message);
      console.log('-- собственное имя прототипа: ' + self.name
        +'; видимое name: '+ this.name + '; контекст вызова: '+ message);
}
var A  = Object.create(null); //описываем цепочку прототипов C -> B -> A
A.name = 'A';
A.log  = make_method(A, message);

var B  = Object.create(A);
B.name = 'B';
B.log  = make_method(B, message);

var C  = Object.create(B);
C.name = 'C';
C.log  = make_method(C, message);

//===тестируем вызовами методов===
A.log('~A~');
//=>-- собственное имя прототипа: A; видимое name: A; контекст вызова: ~A~

B.log('~B~');
//=>-- собственное имя прототипа: A; видимое name: B; контекст вызова: ~B~
//=>-- собственное имя прототипа: B; видимое name: B; контекст вызова: ~B~

C.log('~C~');
//=>-- собственное имя прототипа: A; видимое name: C; контекст вызова: ~C~
//=>-- собственное имя прототипа: B; видимое name: C; контекст вызова: ~C~
//=>-- собственное имя прототипа: C; видимое name: C; контекст вызова: ~C~