2012-02-23 3 views
5

Я использую шаблон модуля 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 немного медленнее, но я не был уверен, что сохранение перечислений как «частных» уменьшит использование памяти. Может ли кто-нибудь объяснить разницу в объеме памяти и производительности для двух (если они есть)? Любые другие предложения/рекомендации приветствуются.

ответ

4

... но я не был уверен, сохраняя перечисления как «частной» уменьшил использование памяти

Противоположные, если что-нибудь: Вы все еще должны иметь перечисления объекта, и у вас должна быть функция для доступа к нему.

Что касается скорости, я бы не стал беспокоиться об этом. Добавленный вызов функции не будет иметь никакого реального значения (I looked into it, когда беспокоится об использовании нового forEach и тому подобное, и даже на IE6 с массовым 10 медленным двигателем JS это просто не имеет значения).

В течение нескольких лет, вы, вероятно, будет в состоянии иметь лучшее из обоих миров: Перечисления, которые только для чтения, благодаря Object.defineProperties функции 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 

По умолчанию, свойства созданных с defineProperties: только для чтения.

Фактически, вы можете в принципе иметь это сейчас, если вы добавите «шайбу» ES5, чтобы создать Object.defineProperties в браузерах, которые еще не имеют его изначально. Версия «shimmed» будет создавать свойства чтения и записи, поскольку только поддерживаемая версия может действительно создавать свойства только для чтения, но теперь вы можете написать код и знать, что он будет работать, как вам нравится, в современных браузерах (около половины все веб-серферы в настоящее время имеют их), все еще работая, с меньшей надежностью, на менее современных.

И, конечно же, EMCAScript6 может занять больше места, но это еще одна вещь в будущем.

+0

Спасибо, что нашли время ответить и получить информацию о ES5. Знаете ли вы, что касается управления памятью в браузере, как реализация 1 хранит свою частную переменную vs реализация 2 в хранилище ее публичного имущества? Я попытался профилировать потребление памяти, но все, что я мог выяснить, это то, что реализация 2 сделала размер объекта MyApp более крупным, а реализация 1 - нет. Но я знаю, что реализация 1 должна где-то хранить ссылку на приватную переменную. –

+0

@steve_ut: он хранится в том, что называется (глубокий вдох) * объект привязки переменной * к контексту * выполнения вызова анонимной функции, которую вы используете для создания объекта. * (whew) * :-) Это терминология [ES5 spec] (http://es5.github.com) ([каноническая ссылка] (http://www.ecma-international.org/publications/standards/Ecma- 262.htm)). Каждый вызов функции получает объект привязки переменных, который содержит аргументы функции, ее локальные вары и некоторые другие свойства как свойства.Описание со старой терминологией здесь * [Замки не сложны] (http://goo.gl/OzIQY) *. –

+0

@steve_ut: Или, вернее, он хранится в общем пуле памяти, а объект привязки переменных имеет ссылку на него. Это также более правильный способ взглянуть на ваш объект MyApp; любой инструмент, который вы используете для сопоставления размера 'MyApp', дает вам некоторую упрощенную информацию. JavaScript - это все объекты в пуле памяти со ссылками друг на друга. Объект 'MyApp' из реализации 2 фактически не содержит * объекта, на который ссылается' app.Enums', больше, чем реализация 1. –

Смежные вопросы