2012-06-26 6 views
3

Отказ от ответственности: Я использую ExtJS 3, но я не думаю, что это очень актуально для вопроса, за пределами общего использования функции имён имен.Смещение объекта функции в JavaScript

У меня есть одноплодной, который объявлен в очень долгое пространство имен, как это:

Ext.ns("REALLY.REALLY.LONG.NAMESPACE"); 

var Singleton = (function() { 
    var foo = { 
     bar: "baz" 
    }; 

    var privateFunction = function(param){ 
     // ... 
     return foo; 
    }; 

    var single = Ext.extend(Object, { 
     constructor: function(config) { 
      Ext.apply(this, config); 
     }, 
     otherFunction: privateFunction,  
     publicFunction: function (someObject){ 
      // do stuff with someObject 
     } 
    }); 

    return single; 

})(); 
// Make it a singleton 
REALLY.REALLY.LONG.NAMESPACE.Singleton = new Singleton(); 

я использую его в других модулях через вызовы, как REALLY.REALLY.LONG.NAMESPACE.Singleton.otherFunction(); и REALLY.REALLY.LONG.NAMESPACE.Singleton.publicFunction(myObject);. Мне интересно, могу ли я поменять эти вызовы, настроив клиентский модуль с псевдонимом на singleton, т. Е. var singleton = REALLY.REALLY.LONG.NAMESPACE.Singleton;, чтобы я мог позвонить singleton.otherFunction();. Мне интересно, если это anti-pattern, или если есть какие-то подводные камни (память?), Я мог бы столкнуться с этим использованием.

Спасибо StackOverflow!

ответ

7

Я интересно, если я могу поменять те вызовы, настройки клиентского модуля с псевдонимом для одноточечного

Да, вы можете.

Мне интересно, если это анти-шаблон, или если есть какие-либо подводные камни (память?), Я мог бы столкнуться с этим использованием.

Нет, я не могу думать об этом, и это быстрее, чем вызов полной версии.

Local Alias Pattern


Пример:

function somefunc(){ 
    var singleton = REALLY.REALLY.LONG.NAMESPACE.Singleton; 

    singleton.publicFunction(); 
}; 

Или:

(function somfunc(singleton){ 

}(REALLY.REALLY.LONG.NAMESPACE.Singleton)); 

Результаты тестов:

http://jsfiddle.net/jMg9A/

+0

это правда :) – cuzzea

+0

@ Xander - отличный пример на IEF! – alvincrespo

+1

@alvincrespo Ха-ха, хороший звонок ... Ксандер, я даже не подумал добавить его в аргументы, переданные моему закрытию. ** D'OH! ** – blong

2

Там не проблема с созданием ссылки на оригинал «объект». Во многих случаях мы создаем пространство имен для организации нашего кода, но, разумеется, это может привести к действительно длинным пространствам имен, о которых мы действительно не хотим ссылаться позже, тем самым создавая локальную ссылку на это пространство имен, является отличной идеей, так что вы можете измените его в одном месте, а не в разных местах.

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

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