免责声明:我正在使用ExtJS 3,但我认为它与该问题无关,除了它的命名空间功能的常用用法之外。

我有一个很长的命名空间中声明的单例,如下所示:

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);等调用在其他模块中使用它。我想知道是否可以通过为客户端模块设置单例别名var singleton = REALLY.REALLY.LONG.NAMESPACE.Singleton;来替换那些调用,以便我可以调用singleton.otherFunction();。我想知道这是否是anti-pattern,或者是否有任何陷阱(内存?),我可能会遇到这种用法。

谢谢StackOverflow!

最佳答案



是的你可以。



不,我想不出什么,它比调用完全限定的版本要快。

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/

10-04 16:00