2013-02-21 16 views
19

Gram z util.inheritsmethod from node.js i nie mogę uzyskać pożądanego zachowania.util.inherits - jak wywołać metodę super na instancji?

var util = require("util"); 

function A() { 
    this.name = 'old'; 
} 

A.prototype.log = function(){ 
    console.log('my old name is: '+ this.name); 
}; 

function B(){ 
    A.call(this); 
    this.name = 'new'; 
} 

util.inherits(B, A); 

B.prototype.log = function(){ 
    B.super_.prototype.log(); 
    console.log('my new name is: ' + this.name); 
} 

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

Wynikiem jest:

my old name is: undefined 
my new name is: new 

Jednak to, co chciałbym to:

my old name is: new 
my new name is: new 

Czego mi brakuje?

Odpowiedz

38

Oto jak osiągnąć to, czego szukasz:

B.prototype.log = function() { 
    B.super_.prototype.log.apply(this); 

    console.log('my new name is: ' + this.name); 
}; 

Gwarantuje kontekst this jest instancją B zamiast bycia B.super_.prototype sądzę.

+8

Inny sposób: B.super_.prototype.log.call (this); – Klaasvaak

+1

Przyjemniejsze połączenie jest lepszym wyborem. Http://jsperf.com/function-calls-direct-vs-apply-vs-call-vs-ind/6 – korCZis

+2

Wolę używać słowa kluczowego "this": 'this .constructor.super_.prototype.log.call (this) ', dzięki czemu nie trzeba używać nazwy klasy ponownie w metodzie – kit

0

Wolę wywoływać metodę super przez prototype chain zamiast constructor chain jak poniżej.

var prototype = C.prototype; 

prototype.log = function() { 
    Object.getPrototypeOf(prototype).log.call(this) 

    // or old style 
    prototype.__proto__.log.call(this) 
} 

Są one dostępu prototyp przedmiotem super klasy, ale przy użyciu prototype chain może być lepiej niż constructor.super_.prototype od constructor chain.

ponieważ zwykle chowam metody protected, private w oddzielnych plikach i pod folderem prototype. Tylko public metody są z funkcją constructor w same scope. Ponadto, aby ułatwić poruszanie się po różnych klasach. Wszystkie z nich mają nazwę prototype.method = function() {...}, więc większość z nich może uzyskać dostęp tylko do obiektu prototypowego.

Lub byłoby dobrze wiedzieć, jaką korzyść przejść przez constructor chain? Właśnie dlatego znalazłem ten post.

Powiązane problemy