2012-02-23 10 views
5

Sto utilizzando il modello di modulo Javascript per provare a implementare funzionalità di enumerazione C#. Ho due modi in cui attualmente sto pensando di implementare questa funzionalità ma non capisco tutti i vantaggi o vantaggi dell'uno contro l'altro.Modulo Javascript Memoria Impronta e prestazioni

Ecco implementazione 1:

var MyApp = (function (app) { 

    // Private Variable 
    var enums = { 
     ActionStatus: { 
      New: 1, 
      Open: 2, 
      Closed: 3 
     } 
    }; 

    // Public Method 
    app.getEnum = function (path) { 
     var value = enums;    
     var properties = path.split('.'); 
     for (var i = 0, len = properties.length; i < len; ++i) { 
      value = value[properties[i]]; 
     } 
     return value; 
    }; 

    return app; 

})(MyApp || {}); 

// Example usage 
var status = MyApp.getEnum("ActionStatus.Open"); 

E ora implementazione 2:

var MyApp = (function (app) { 

    // Public Property 
    app.Enums = { 
     ActionStatus: { 
      New: 1, 
      Open: 2, 
      Closed: 3 
     } 
    }; 

    return app; 

})(MyApp || {}); 

// Example usage 
var status = MyApp.Enums.ActionStatus.Open; 

La differenza principale è in utilizzando una variabile "privata" contro una proprietà "pubblica" per memorizzare le enumerazioni. Penserei che l'implementazione 1 sia un po 'più lenta, ma non ero sicuro che mantenere l'enumerazione come "privata" riducesse l'utilizzo della memoria. Qualcuno può spiegare la differenza di impronta di memoria e le prestazioni per i due (se presente)? Qualsiasi altro suggerimento/consiglio è apprezzato.

risposta

4

... ma non ero sicuro se mantenendo le enumerazioni come "privato" ridotto l'utilizzo della memoria

Il contrario, semmai: Si devono ancora avere le enumerazioni opporsi, e devi avere una funzione per accedervi.

In termini di velocità, non me ne preoccuperei. La chiamata alla funzione aggiunta non farà alcuna differenza reale (I looked into it se preoccupato per l'utilizzo del nuovo forEach e così, e anche su IE6 con il suo motore JS lento massivamente, non importa).

In un paio d'anni, probabilmente sarete in grado di avere il meglio dei due mondi: enumerazioni che sono di sola lettura, grazie alla Object.defineProperties caratteristica di ECMAScript5:

var Enums = Object.defineProperties({}, { 
    ActionStatus: { 
     value: Object.defineProperties({}, { 
      New: {value: 1}, 
      Open: {value: 2}, 
      Closed: {value: 3} 
     }) 
    } 
}); 

// Usage 
var n = Enums.ActionStatus.New; // 1 

Per impostazione predefinita, le proprietà creati con defineProperties sono di sola lettura.

In effetti, ora puoi praticamente averlo ora se aggiungi uno "shim" ES5 per creare Object.defineProperties su browser che non lo hanno ancora in modo nativo. La versione "shimmed" creerebbe proprietà read-write, poiché solo la versione supportata in modo nativo può davvero creare proprietà di sola lettura, ma puoi scrivere il codice ora e sapere che funzionerà come vuoi sui browser moderni (circa la metà di attualmente tutti i navigatori web li hanno) mentre lavorano ancora, solo con meno robustezza, su quelli meno moderni.

E, naturalmente, EMCAScript6 potrebbe fare di più, ma è ancora una cosa futura.

+0

Grazie per aver trovato il tempo di rispondere e per le informazioni ES5. Sai in termini di gestione della memoria del browser come l'implementazione 1 memorizza la sua variabile privata rispetto all'implementazione 2 della sua proprietà pubblica? Ho provato a profilare il consumo di memoria, ma tutto ciò che ho potuto scoprire è che l'implementazione 2 ha reso le dimensioni dell'oggetto MyApp più grandi mentre l'implementazione 1 non lo faceva. Ma so che l'implementazione 1 deve memorizzare il riferimento alla variabile privata da qualche parte. –

+0

@steve_ut: È memorizzato in qualcosa chiamato (respiro profondo) * oggetto vincolante variabile * del * contesto di esecuzione * della chiamata alla funzione anonima che stai usando per creare l'oggetto. * (whew) * :-) Questa è la terminologia [ES5 spec] (http://es5.github.com) ([link canonico] (http://www.ecma-international.org/publications/standards/Ecma- 262.htm)). Ogni chiamata a una funzione ottiene un oggetto vincolante variabile, che contiene gli argomenti della funzione, i suoi oggetti locali e alcune altre proprietà come proprietà.Descrizione con terminologia più vecchia qui * [Le chiusure non sono complicate] (http://goo.gl/OzIQY) *. –

+0

@steve_ut: Oppure realtà, per essere più corretti, è memorizzato nel lotto di memoria generale e l'oggetto di legame variabile ha un riferimento ad esso. Questo è anche il modo più corretto di guardare l'oggetto 'MyApp'; qualunque strumento tu stia usando per mappare la dimensione di 'MyApp' ti sta dando alcune informazioni semplificate. JavaScript riguarda tutti gli oggetti nel pool di memoria con riferimenti reciproci. L'oggetto 'MyApp' dall'implementazione 2 in realtà non * contiene * l'oggetto a cui fa riferimento' app.Enums' più di quanto non faccia l'implementazione 1. –

Problemi correlati