2010-08-19 12 views
14

Ho una classe simile a quella riportata di seguito. Come posso chiamare il mio metodo init quando viene creato l'oggetto? Non voglio creare un'istanza del mio oggetto, quindi chiamare l'inizializzazione come faccio di seguito.Classe JavaScript - Metodo di chiamata quando l'oggetto è inizializzato

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

nessuna delle soluzioni funziona se le proprietà da utilizzare sono in realtà definiti prototipo e il codice prototipo sembra essere al di sotto di questa funzione di costruzione. –

risposta

30

NB. I nomi delle funzioni del costruttore dovrebbero iniziare con una lettera maiuscola per distinguerli dalle funzioni ordinarie, ad es. MyClass anziché myClass.

entrambi i casi è possibile chiamare init dalla funzione di costruzione:

var myObj = new MyClass(2, true); 

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

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

    // ... 

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

O più semplicemente si può solo copiare il corpo della funzione init alla fine della funzione di costruzione. Non è necessario avere effettivamente una funzione init se è chiamata solo una volta.

+1

Grazie. In realtà ho provato a chiamare "this.init();" prima di postare, ma stavo facendo la chiamata prima della dichiarazione di funzione, ecco perché non avrebbe funzionato. =] –

+0

Come dovrei fare lo stesso se definisco il mio oggetto semplicemente da 'var obj = {init: function() {...}}'? Come dovrei chiamarlo? – Eugene

+0

@Eugene - Cosa c'è di sbagliato con: 'var makeObj = function (x, y) {return {a: x + y}; } 'È una funzione che crea un oggetto ed esegue qualsiasi inizializzazione di una volta richiesta prima di restituirla. A volte chiamato funzione di fabbrica. –

1

Basta aggiungere

this.init(); 

alla funzione myClass.

3

Vedere sotto per una possibile risposta e alcune correzioni al codice.

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

Grazie, quello era un refuso quando si convertiva la mia vera classe in un semplice esempio per la domanda. –

5

C'è ancora più agevole modo per farlo:

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

Ciò sia creare metodo e chiamarla.

1

Le classi JavaScript introdotte in ECMAScript 2015 sono principalmente zucchero sintattico rispetto all'ereditarietà basata su prototipo esistente di JavaScript. La sintassi della classe non sta introducendo un nuovo modello di ereditarietà orientata agli oggetti su JavaScript. Le classi JavaScript forniscono una sintassi molto più semplice e chiara per creare oggetti e gestire l'ereditarietà.

- MDN web docs

Quando si utilizza questa sintassi, perché solo il metodo constructor() viene eseguito su di istanza non si può auto-istanziare un oggetto. Devi sempre aggiungere 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')

Problemi correlati