2009-07-30 5 views
5

möchte ich Unterklasse B erstellen, die von Super-Klasse A. mein Code hier erbt:JavaScript-Objekt Unterklasse

function A(){ 
    this.x = 1; 
} 

B.prototype = new A; 
function B(){ 
    A.call(this); 
    this.y = 2; 
} 
b = new B; 
Console.log(b.x + " " + b.y); 

, wenn es ausgeführt, zeigen Sie sie B nicht definiert ist.

Antwort

7
B.prototype = new A; 
function B(){ 
    A.call(this); 
    this.y = 2; 
} 

sollte

function B(){ 
    A.call(this); 
    this.y = 2; 
} 
B.prototype = new A; 
+0

danke im voraus. –

+3

im voraus von dem was –

+7

advance of thanks –

17

Sie müssen die B Konstruktorfunktion definieren, bevor versucht, seinen Prototyp zuzugreifen:

function A(){ 
    this.x = 1; 
} 

function B(){ 
    A.call(this); 
    this.y = 2; 
} 

B.prototype = new A; 

b = new B; 
console.log(b.x + " " + b.y); // outputs "1 2" 
5

Lynda.com darauf hin, dass Sie den Konstruktor B neben neu zuzuweisen, wie folgt.

function B() { 
    A.call(this); 
    this.y = 2; 
} 

B.prototype = new A; 
B.prototype.constructor = B; 
+0

Weitere Details hier? Es scheint, als wäre 'b = new B' nicht gelungen, es sei denn, der Konstruktor wurde bereits neu zugewiesen. Aber wenn es bereits neu zugewiesen wurde, warum sollte die zweite Zeile es erneut explizit zuweisen? –

+0

Wie geht es Lynda.com und was kümmert es mich, was sie sagen? (Ich stimme dem zu, was sie sagen, aber das ist nicht der Punkt, den ich ansprechen möchte.) – LeeGee

1

In der Standardklasse Ableitung gibt es die fast universellen Fehler, von einer neu erstellten Basisklasse-Instanz (B.prototype = new A) abzuleiten. Der Basisklassenkonstruktor führt zumindest unnötigen Code aus und kann im schlimmsten Fall ohne die Eingabeargumente abstürzen, die nicht nur zur Ableitung künstlich erzeugt werden sollten. Darüber hinaus werden Instanzfunktionen der Basisklasseninstanz Teil des Prototyps abgeleiteter Klassen, der nur durch Zufall geeignet ist.

Lässt klar sein! Wenn Sie von einer Basisklasseninstanz erben, die vom Basisklassenkonstruktor (B.prototype = new A) erstellt wurde, erben Sie nicht direkt von der Basisklasse !! Sie haben in der Vererbungskette einen Intermediär angelegt, nämlich die Basisklasseninstanz !!! Autsch!!!! Dies ist ineffizient, da bei der Suche nach geerbten Eigenschaftswerten in der Vererbungskette eine zusätzliche Tiefe besteht. Diese Tiefe akkumuliert sich jedes Mal, wenn Sie diesen Fehler machen.

Also was ist der richtige Weg. Anstelle von B.prototype = new A sollten Sie schreiben B.prototype = Object.create (A.prototype). Dies kann nicht hat in 09. Allerdings in 09 gibt es noch

protoProxy = function(myClass) 
{ 
    function foo(){}; 
    foo.prototype = myClass.prototype; 
    return new foo(); 
} 

als Ersatz für Object.create zur Verfügung. Anstelle von B.prototype = new A sollten Sie B.prototype = protoProxy (A) in 09 schreiben;