Рекомендуется использовать технологию имен в JavaScript. производительный? вопросы, о которых нужно знать?

В project Я работаю над созданием своего кода следующим образом

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.");

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

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

Ответ 1

Когда вы структурируете свой код как большую гигантскую иерархию объектов и свойств, иногда возникают проблемы, когда 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

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

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

Вот обсуждение SO альтернативных способов использования пространств имен.

Ответ 3

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

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

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

  var myProperty;

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

 myNameSpace.module1.myProperty;

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

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