2013-07-25 3 views
6

В следующем фрагменте кода, как я могу получить доступ к A.prototype.log внутри B.prototype.log?Переопределение метода унаследованного прототипа и вызов оригинала внутри нового

function A() {} 

A.prototype.log = function() { 
    console.log("A"); 
}; 

function B() {} 

B.prototype = Object.create(A.prototype); 
B.prototype.constructor = B; 

B.prototype.log = function() { 
    //call A.prototype.log here 
    console.log("B"); 
}; 

var b = new B(); 
b.log(); 

Я знаю, что я мог бы просто написать A.prototype.log.call(this), но я подумал, может быть, есть более элегантный способ, который позволяет мне называть его по относительному пути, как «вызов метода„войти“на следующий вышестоящий в прототип цепи ". Что-то вроде этого возможно?

+1

Фактически, 'A.prototype.log.call (this)' был именно тем, что я искал. Спасибо! – ProblemsOfSumit

ответ

5

Вы можете использовать Object.getPrototypeOf

... 
B.prototype.log = function() { 
    Object.getPrototypeOf (B.prototype).log.call(this) 
    console.log("B"); 
}; 
... 
b.log(); //A B 

Примечание: Object.getPrototypeOf является ECMASript 5 см compatibility


Существует также нестандартное и осуждается __proto__ свойство (compatibility) который

ссылается на тот же объект, как внутреннего свойства [[Prototype]]

и позволит вам вызвать метод журнала ваших A S', как это

B.prototype.__proto__.log.call(this)

Но

Предпочтительный метод - использовать Object.getPrototypeOf.

+0

+1 Это определенно способ, да! Благодаря! – basilikum

+0

@basilikum Добро пожаловать =) – C5H8NNaO4

+0

@ C5H8NNaO4 в коде есть тип, правильным является 'Object.getPrototypeOf (B.prototype.log) .call (this)' – loretoparisi

Смежные вопросы