Рекомендуется использовать технологию имен в 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;
Я думаю, что разница в скорости не очень велика, если вы просто не используете пространство имен, а преимущество избежания потенциальных конфликтов - большой плюс пространства имен.
Тем не менее, всегда полезно помнить об этой проблеме.