2010-08-19 11 views
14

Ich habe eine Klasse ähnlich der folgenden. Wie rufe ich meine init Methode auf, wenn das Objekt erstellt wird? Ich möchte nicht eine Instanz meines Objekts erstellen und dann initialisieren, wie ich es unten tun muss.JavaScript-Klasse - Call-Methode, wenn Objekt initialisiert

var myObj = new myClass(2, true); 
myObj.init(); 

function myClass(v1, v2) 
{ 
    // public vars 
    this.var1 = v1; 

    // private vars 
    var2 = v2; 

    // pub methods 
    this.init = function() { 
     // do some stuff   
    }; 

    // private methods 
    someMethod = function() { 
     // do some private stuff 
    }; 
} 
+0

keine der Lösungen hinzuzufügen, arbeiten, wenn Eigenschaften verwendet werden, sind unter dieser Konstruktorfunktion sein geschieht tatsächlich definiert Prototyp und Prototyp-Code. –

Antwort

30

NB. Konstruktorfunktionsnamen sollten mit einem Großbuchstaben beginnen, um sie von gewöhnlichen Funktionen zu unterscheiden, z. MyClass anstelle von myClass.

Entweder können Sie init von Ihrem Konstruktor-Funktion aufrufen:

var myObj = new MyClass(2, true); 

function MyClass(v1, v2) 
{ 
    // ... 

    // pub methods 
    this.init = function() { 
     // do some stuff   
    }; 

    // ... 

    this.init(); // <------------ added this 
} 

Oder einfacher können Sie nur den Körper der init Funktion bis zum Ende der Konstruktorfunktion kopieren. Keine Notwendigkeit, tatsächlich eine init Funktion zu haben, wenn sie nur einmal aufgerufen wird.

+1

Danke. Ich habe tatsächlich versucht, 'this.init(); vor dem Posten, aber ich machte den Anruf vor der Funktionsdeklaration, deshalb würde es nicht funktionieren. =] –

+0

Wie soll ich das gleiche machen, wenn ich mein Objekt einfach mit 'var obj = {init: function() {...}}' definiere? Wie soll ich es nennen? – Eugene

+0

@Eugene - Was ist los mit: 'var makeObj = Funktion (x, y) {return {a: x + y}; } 'Es ist eine Funktion, die ein Objekt erstellt und die einmalige Initialisierung vor der Rückgabe ausführt. Wird manchmal als Factory-Funktion bezeichnet. –

1

Fügen Sie einfach

this.init(); 

auf Ihre myClass Funktion.

3

Unten finden Sie eine mögliche Antwort und einige Korrekturen an Ihrem Code.

function myClass(v1, v2) 
{ 
    // public vars 
    this.var1 = v1; 

    // private vars 
    // use var to actually make this private 
    var var2 = v2; 

    // pub methods 
    this.init = function() { 
     // do some stuff   
    }; 

    // private methods 
    // this will be private as though it had been declared with var 
    function someMethod() { 
     // do some private stuff 
    }; 

    //call init 
    this.init(); 
} 
+0

Danke, das war ein Tippfehler bei der Umwandlung meiner realen Klasse in ein einfaches Beispiel für die Frage. –

5

Es gibt noch glatten Weg, dies zu tun:

this.init = function(){ 
    // method body 
}(); 

Dies wird sowohl Methode erstellen und es nennt.

1

JavaScript-Klassen, die in ECMAScript 2015 eingeführt wurden, sind in erster Linie syntaktischer Zucker gegenüber der vorhandenen prototypbasierten Vererbung von JavaScript. Die Klassensyntax führt kein neues objektorientiertes Vererbungsmodell für JavaScript ein. JavaScript-Klassen bieten eine viel einfachere und klarere Syntax zum Erstellen von Objekten und zum Umgang mit Vererbung.

- MDN web docs

Wenn diese Syntax verwenden, da nur die constructor() Methode auf Instanzierung ausgeführt wird Sie nicht können Auto-instanziiert ein Objekt. Sie haben immer user = new MyUser()

var user; 
 

 
class MyUser { 
 
    constructor(var1, var2) { 
 

 
    this.var1 = var1; 
 
    this.var2 = var2; 
 

 
    } 
 

 
    static staticMethod() { 
 

 
    // accessed directly with the class name `MyUser` 
 

 
    } 
 

 
    instanceMethod() { 
 

 
    // accessed with object instance 
 
return true 
 
    } 
 

 
} 
 

 
user = new MyUser('hey','there')

Verwandte Themen