2009-06-19 5 views
0

Was ist der Vorteil einer Konstruktorfunktion wie so verwenden:Was ist der Vorteil der Verwendung einer Konstruktorfunktion in einem JavaScript-Objekt?

var MyLibrary = new function(){ 
    var self = this; 
    self.MyLibrary = function(){ 
     // init code 
    } 

} 

Statt einfach den Code innerhalb des Objekts zu schreiben?

var MyLibrary = new function(){ 
    // init code 
} 
+1

Wird Init-Code auch im ersten Fall ausgeführt werden? Es sieht so aus, als würdest du diese Funktion nicht aufrufen (was auch immer das ist). Es ist kein konventioneller "Konstruktor" wie normalerweise in Javascript. – Kekoa

Antwort

3

Keine von beiden ist ganz richtig, obwohl die zweite funktionieren könnte, aber ist nicht wirklich ein Objekt, eher wie ein Singleton (aber in einer seltsamen Art und Weise). Hier ist ein Beispiel für eine Klasse mit einem Konstruktor:

// Class & Constructor definition 
function Rectangle(w,h) { 
    this.width = w; 
    this.height = h; 
} 

// Now your class methods go on the prototype object 
Rectangle.prototype.area = function() { 
    return this.width * this.height; 
} 

nun diese Klasse zu verwenden:

var myRect = new Rectangle(3,4); 
myRect.area(); 

Sie auch eine Klasse von Speichern des ‚Konstruktor‘ auf einen var anonyme Funktionen definieren kann statt benannte Funktionen:

// Class & Constructor definition 
var Rectangle = function(w,h) { 
    this.width = w; 
    this.height = h; 
} 

// Now your class methods go on the prototype object 
Rectangle.prototype.area = function() { 
    return this.width * this.height; 
} 
3

Nun, wenn Sie Prototypvererbung verwenden neue Klassen zu erstellen, werden Sie so etwas tun:

function MyBaseClass() { 
    // common stuff here 
} 

function MySubClass() { 
    // subclass-specific stuff here 
} 

MySubClass.prototype = new MyBaseClass(); 

Die letzte Zeile der Vererbungskette zu etablieren erforderlich ist. Es hat jedoch auch den Nebeneffekt, den Rumpf von MyBaseClass auszuführen, der Probleme verursachen kann (insbesondere wenn die MyBaseClass-Funktion Argumente erwartet).

Wenn Sie nicht wollen, dass das geschehen, so etwas wie folgt aus:

function MyBaseClass() { 
    this.init = function() { 
     // initialisation stuff here 
    } 
    // common stuff here 
} 

function MySubClass() { 
    // subclass-specific stuff here 
    this.init(); 
} 

MySubClass.prototype = new MyBaseClass(); 

Der Code Initialisierung in init jetzt wird nur ausgeführt, wenn Sie eine Instanz von MySubClass erstellen.

+0

Verwenden Sie keine Instanzen für die Vererbung von Prototypen. Verwenden Sie Object.create, falls verfügbar – aehlke

+0

Der Prototyp eines Objekts muss eine Instanz sein. – harto

Verwandte Themen