2010-11-07 11 views
12

Sto cercando di imparare ExtJS e JavaScript orientato agli oggetti in generale. Ho visto persone che definiscono classi in spazi dei nomi personalizzati in un paio di modi. Qual è la differenza tra questi due metodi?ExtJS 3: Due modi per creare classi personalizzate: qual è la differenza?

Metodo 1

Ext.ns('myapp.cars'); 
(function(){ 
    var Car = Ext.extend(Object, { 
     //... 
    }) 

    myapp.cars.Car = Car; 
})() 

Metodo 2

Ext.ns('myapp.cars'); 
myapp.cars.Car = Ext.extend(Object, { 
     //... 
}); 

Metodo 2 è più facile da leggere e richiede meno codice; c'è qualche ragione per cui il Metodo 1 è meglio? Grazie!

+1

Vuoi dire che il Metodo 2 è più facile da leggere e richiede meno codice? – fijiaaron

+0

@fijiaaron Sì! Corretto. –

risposta

6

È praticamente lo stesso, tranne che è possibile utilizzare le variabili private nella funzione autoesposta del primo metodo, mentre nella seconda è possibile definire solo variabili globali.

Ad esempio:

Ext.ns('myapp.cars'); 
(function(){ 

    var carInfo = { 
     goodEngine: true 
    }; 

    var Car = Ext.extend(Object, { 
     info: carInfo 
    }); 

    myapp.cars.Car = Car; 
})() 

// carInfo is undefined here, so this will give an error 
alert(carInfo.goodEngine); 

Così, il primo metodo è molto utile se si lavora con un Bunge di variabili che non utilizzerà in seguito.

+0

Questa è la mia implementazione preferita del pattern, anche se ho problemi con una cosa ... @Harmen Ho una domanda, se sto estendendo una classe Ext, ad esempio 'var MyWindowClass = Ext.extend (Ext. Window, {...}); ' Sai come posso usare le configurazioni di default dichiarate in' MyWindowClass' e poi, se estendo ulteriormente (cioè 'var MySuperWindowClass = Ext.extend (myapp.MyWindowClass, {.. .}); ') dichiara nuovamente le configurazioni di default che verranno applicate insieme alle configurazioni di default in MyWindowClass? – blong

6

Di seguito sono praticamente equivalenti:

var Car = Ext.extend(Object, { 
    //... 
}); 

myapp.cars.Car = Car; 

... e:

myapp.cars.Car = Ext.extend(Object, { 
    //... 
}); 

Nel primo esempio che ci si stia utilizzando una variabile temporanea per contenere un riferimento all'oggetto appena creato , che viene quindi copiato in myapp.cars.Car (il riferimento viene copiato, non l'oggetto). Nel secondo esempio assegneresti il ​​riferimento all'oggetto direttamente a myapp.cars.Car.

Il motivo per cui il primo esempio è stato incluso nella funzione anonima autoinvitante (function(){ })() consiste nel limitare l'ambito di tale variabile temporanea. Questo è generalmente fatto per non inquinare lo spazio dei nomi globale con quella variabile Car. Se esistesse un'altra variabile Car definita altrove, non sarebbe in conflitto con questa. Esempio:

var Car = "My Nice Car"; 

(function(){ 
    var Car = Ext.extend(Object, { 
     //... 
    }); 

    myapp.cars.Car = Car; 
})(); 

alert(Car); // Still "My Nice Car" 
      // No conflict with the `Car` variable in the self invoking function. 
Problemi correlati