Техника пространств имен в JavaScript, рекомендуется? производительный? вопросы, которые нужно знать? - PullRequest
4 голосов
/ 20 января 2010

В проекте , над которым я работаю, я структурирую свой код следующим образом

MyLib = {
    AField:0,

    ASubNamespace:{
        AnotherField:"value",

        AClass:function(param) {
            this.classField = param;

            this.classFunction = function(){
                // stuff
            }
        }
    },

    AnotherClass:function(param) {
        this.classField = param;

        this.classFunction = function(){
            // stuff
        }
    }
}

и так далее, чтобы делать такие вещи, как:

var anInstance = new MyLib.ASubNamespace.AClass("A parameter.");

Это правильный путь к достижению пространства имен? Есть ли хиты производительности, и если да, то насколько сильны? Снижается ли производительность по мере того, как я вкладываюсь глубже? Есть ли другие проблемы, о которых мне следует знать при использовании этой структуры?

Я забочусь о каждом небольшом уровне производительности, потому что это библиотека для графики в реальном времени, поэтому я очень серьезно отношусь к любым издержкам.

Ответы [ 3 ]

5 голосов
/ 20 января 2010

Я полагаю, что пространство имен является важной частью написания поддерживаемого JavaScript, особенно если вы работаете с командой разработчиков.

Проблемы производительности, связанные с пространством имен, должны быть минимальными, если вы сжимаете / минимизируете свой код на пути к производству.

Вот ТАКОЕ обсуждение альтернативных способов использования пространств имен.

4 голосов
/ 11 июня 2010

Когда вы структурируете свой код как большую гигантскую иерархию свойств объекта, у вас иногда возникают проблемы, когда MyNamespaceObj.prop1 еще не доступен для MyNamespaceObj.prop2. И еще есть тот факт, что вы часто заканчиваете тем, что набираете полные имена по всему коду.

Я начинаю понимать, что предпочитаю делать что-то вроде этого:

MyNamespaceObj = (function () {

    // lots of code/definitions that have local scope
    var internallyDefinedItem1 = function (n) { /* ... */ }
    var internallyDefinedItem2 = {
        foo: internallyDefinedItem1(532),
        bar: totallyPrivateNeverExportedFunction(17)
    }
    var totallyPrivateNeverExportedVar = 'blahblahblah';
    function totallyPrivateNeverExportedFunction (x) {
       /* ... */
    }

    return {
        exportedItem1: internallyDefinedItem1,
        exportedItem2: internallyDefinedItem2,
        ...
    }
})();
2 голосов
/ 11 июня 2010

Пространство имен вашего JavaScript имеет решающее значение, чтобы избежать потенциальных конфликтов и перезаписи. Это особенно верно, когда ваш JS окажется в чужой среде, где также может находиться внешний JS.

С учетом вышесказанного наблюдается снижение производительности из-за пространства имен, просто потому, что интерпретатору теперь приходится следовать более длинной цепочке для доступа к требуемой функции / свойству.

Например, что-то вроде

  var myProperty;

доступен немного быстрее по сравнению с:

 myNameSpace.module1.myProperty;

Я думаю, что разница в скорости невелика, если вы не используете пространство имен очень глубоко, и преимущество предотвращения потенциальных конфликтов - большой плюс пространства имен.

Но, тем не менее, всегда полезно помнить об этом.

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