3

免责声明:我使用的是 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();. 我想知道这是否是一种反模式,或者是否有任何陷阱(内存?)我可能会遇到这种用法。

感谢 StackOverflow!

4

2 回答 2

7

我想知道是否可以通过设置具有单例别名的客户端模块来交换这些调用

是的你可以。

我想知道这是否是一种反模式,或者是否有任何陷阱(内存?)我可能会遇到这种用法。

不,没有任何我能想到的,它比调用完全合格的版本更快。

本地别名模式


例子:

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

    singleton.publicFunction();
};

或者:

(function somfunc(singleton){

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

试验结果:

http://jsfiddle.net/jMg9A/

于 2012-06-26T19:30:12.133 回答
2

创建对原始“对象”的引用没有问题。在许多情况下,我们创建一个命名空间来组织我们的代码,但是当然,这可能会导致我们以后真的不希望引用的非常长的命名空间,因此创建对该命名空间的本地引用是一个好主意,这样您就可以在一个地方而不是在不同的地方改变它。

我在这里并没有真正看到蚂蚁模式,相反,我看到了一个让你自己更简单的机会,并且从开发人员的角度来看可能更易于管理。

于 2012-06-26T19:56:20.483 回答