Модуль памяти шаблонов Javascript и производительность - PullRequest
5 голосов
/ 23 февраля 2012

Я использую Шаблон модуля Javascript, чтобы попытаться реализовать функциональность, подобную перечислению C #. У меня есть два способа, которыми я сейчас думаю о реализации этой функциональности, но я не понимаю всех преимуществ одного или другого способа.

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

1 Ответ

4 голосов
/ 23 февраля 2012

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

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

Что касается скорости, я бы об этом не беспокоился. Добавленный вызов функции не будет иметь никакого значения (я изучил его , когда беспокоился об использовании нового forEach и тому подобного, и даже в IE6 с его массово медленным 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 может пойти дальше, но это все еще в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...