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.
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. –
@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) *. –
@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. –