2013-11-26 4 views
3

У меня есть такой код:Как вызвать родительский метод из дочернего метода?

function A() { 
    this.hello = function() { 
     console.log("I'm A"); 
    } 
} 

function B() { 
    this.hello = function() { 

     // I need to call A.hello here, like parent.hello(); 
     B.prototype.hello(); // This is wrong, TypeError 

     console.log("I'm B"); 
    } 
} 

B.prototype = new A(); 
var b = new B(); 

b.hello(); 
#=> TypeError: Cannot call method 'hello' of undefined 

Я читал некоторые подобные вопросы здесь, но все они используют эту технику, они назначают метод к prototype.

FaqPage.prototype.init = function(name, faq) { 
    BasePage.prototype.init.call(this, name); 
    this.faq = faq; 
} 
FaqPage.prototype.getFaq = function() { 
    return this.faq; 
} 

Но это не в моем случае. Мой prototype является экземпляром родителя. Как можно вызвать родительский метод в моем случае? Или мне нужно реорганизовать мой код?

+0

[Простой JavaScript Наследование] (http://ejohn.org/blog/simple-javascript-inheritance/) – Andreas

+1

Как с помощью 'B.prototype = new A();' будет выполнять конструктор 'A', который может быть не таким, каким вы хотите, и может привести к нежелательным побочным эффектам. Вы можете использовать 'B.prototype = Object.Create (A.prototype);', чтобы получить тот же результат, но конструктор 'A' будет ** не ** выполняться. Конечно, вам нужно убедиться, что 'hello' является частью фактического' A.prototype', см. [** скрипка **] (http://jsfiddle.net/wZTy8/) – Nope

ответ

3

Вам необходимо присвоить значение this.hello в момент, когда вы просто создаете функцию для запуска.

Попробуйте следующее:

function A() { 
    this.hello = function() { 
     console.log("I'm A"); 
    } 
} 

function B() { 
    this.hello = function() {  
     B.prototype.hello(); // Now runs correctly and logs "I'm A" 

     console.log("I'm B"); 
    } 
} 

B.prototype = new A(); 
var b = new B(); 

b.hello(); 

Изменяя код, чтобы быть this.hello = function() { } мы создаем свойство объекта, который может быть вызван извне объекта.

Результат вызова b.hello(); является:

I'm A 
I'm B 

Example JSFiddle

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