在JavaScript中对函数对象进行别名

时间:2012-06-26 19:28:02

标签: javascript oop design-patterns extjs3

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

我有一个 singleton ,它在一个非常长的命名空间中声明,如下所示:

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!

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:2)

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

我并不是真的在这里看到一个蚂蚁模式,相反,我认为有机会让自己更简单,从开发人员的角度来看可能更容易管理。