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~