2010-04-21 13 views
10

ich einige Probleme mit der IF-Klausel am Ende dieser Funktion von Pro JavaScript Design Patterns zu verstehen:JavaScript Vererbung erweitert Funktion

function extend(subClass, superClass) { 
    var F = function() {}; 
    F.prototype = superClass.prototype; 
    subClass.prototype = new F(); 
    subClass.prototype.constructor = subClass; 

    subClass.superclass = superClass.prototype; 
    if(superClass.prototype.constructor == Object.prototype.constructor) { 
     superClass.prototype.constructor = superClass; 
    } 
} 

Das Buch erklärt, dass diese Linien sorgen dafür, dass die Konstruktor-Attribut der übergeordnete Klasse ist richtig gesetzt, auch wenn die Oberklasse die Objektklasse selbst ist. Doch wenn ich diese drei Zeilen auslassen und wie folgt vorgehen:

function SubClass() {}; 
extend(SubClass, Object); 

alert(Object.prototype.constructor == Object); 

Der Alarm sagt, wahr ', was bedeutet, dass der Konstruktor der übergeordneten Klasse richtig eingestellt ist auch ohne diese letzten drei Zeilen. Unter welchen Bedingungen macht diese IF-Anweisung dann etwas Sinnvolles?

Danke.

+0

Ich habe eine Frage: warum die Mittlerfunktion F, statt nur subClass.prototype = new Oberklasse() ;? – 755

Antwort

14

Das Problem, das diese beiden Linien versuchen, zu vermeiden, wird im allgemeinen, wenn Sie die prototype Eigenschaft einer Constructor Funktion ersetzen, zum Beispiel:

function Foo() {}; 
Foo.prototype = { 
    bar: 'baz' 
}; 

var foo = new Foo(); 
foo.constructor === Object; // true, but `constructor` should refer to Foo 

Wenn functions objects are created, die prototype Eigenschaft mit einem neuen Objekt initialisiert wird , die enthält eine constructor Eigenschaft, die sich auf die Funktion verweist, zB:

function Bar() {}; 
var bar = new Bar(); 
bar.constructor === Bar; // true 

Wenn Sie die prototype Eigenschaft ersetzen ein anderes Objekt, dieses Objekt hat seine eigene constructor Eigenschaft, die normalerweise von einem anderen Konstruktor oder von Object.prototype geerbt wird.

var newObj = {}; 
newObj.constructor === Object; 

Empfohlene Artikel:

+1

Das macht es für mich klar. Vielen Dank. Die Erklärung der Autoren für diesen Code ist irreführend. Sie hätten sagen sollen, dass es sicherstellt, dass die Oberklasse nicht selbst unangemessen erweitert wurde. – Zach