Я использую шаблон модуля Javascript, чтобы попытаться реализовать функции перечисления на C#. У меня есть два способа, которыми я сейчас занимаюсь реализацией этой функциональности, но я не понимаю всех преимуществ или преимуществ одного способа в сравнении с другим.След и производительность памяти шаблона модуля Javascript
Вот реализация 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");
А теперь реализация 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;
Основное различие заключается в использовании «частный» переменный против собственности «общественной» для хранения перечислений. Я думаю, что реализация 1 немного медленнее, но я не был уверен, что сохранение перечислений как «частных» уменьшит использование памяти. Может ли кто-нибудь объяснить разницу в объеме памяти и производительности для двух (если они есть)? Любые другие предложения/рекомендации приветствуются.
Спасибо, что нашли время ответить и получить информацию о ES5. Знаете ли вы, что касается управления памятью в браузере, как реализация 1 хранит свою частную переменную vs реализация 2 в хранилище ее публичного имущества? Я попытался профилировать потребление памяти, но все, что я мог выяснить, это то, что реализация 2 сделала размер объекта MyApp более крупным, а реализация 1 - нет. Но я знаю, что реализация 1 должна где-то хранить ссылку на приватную переменную. –
@steve_ut: он хранится в том, что называется (глубокий вдох) * объект привязки переменной * к контексту * выполнения вызова анонимной функции, которую вы используете для создания объекта. * (whew) * :-) Это терминология [ES5 spec] (http://es5.github.com) ([каноническая ссылка] (http://www.ecma-international.org/publications/standards/Ecma- 262.htm)). Каждый вызов функции получает объект привязки переменных, который содержит аргументы функции, ее локальные вары и некоторые другие свойства как свойства.Описание со старой терминологией здесь * [Замки не сложны] (http://goo.gl/OzIQY) *. –
@steve_ut: Или, вернее, он хранится в общем пуле памяти, а объект привязки переменных имеет ссылку на него. Это также более правильный способ взглянуть на ваш объект MyApp; любой инструмент, который вы используете для сопоставления размера 'MyApp', дает вам некоторую упрощенную информацию. JavaScript - это все объекты в пуле памяти со ссылками друг на друга. Объект 'MyApp' из реализации 2 фактически не содержит * объекта, на который ссылается' app.Enums', больше, чем реализация 1. –