【问题标题】:Aliasing a function object in JavaScript在 JavaScript 中给函数对象起别名
【发布时间】:2012-06-26 19:28:02
【问题描述】:

免责声明:我使用的是 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!

【问题讨论】:

    标签: javascript oop design-patterns extjs3


    【解决方案1】:

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

    是的,你可以。

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

    没有,我想不到,而且比调用完全合格的版本要快。

    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/

    【讨论】:

    • @Xander - IEF 上的好例子!
    • @alvincrespo 哈哈,好电话... Xander,我什至没有想过将它添加到传递给我的闭包的参数中。 D'OH!
    • Xander,我必须把它给你。包括测试很棒。实际上,我得到了一些非常疯狂的结果,我想知道这是否是您要链接到的内容:jsfiddle.net/jMg9A/2。鉴于这个结果,看起来局部变量更快,这可能吗?
    • @alvincrespo 我想我应该在这个问题上提到你们两个......使用n 值90000000 给了我更多意想不到的结果。局部变量的出现速度要快几个数量级 --> using window.one.two.three.four.five[fubar] : 10381ms vs. using a[fubar] : 90ms
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-12-13
      • 2017-05-30
      • 2011-12-07
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      • 2019-09-14
      • 2010-11-03
      • 2011-03-08
      相关资源
      最近更新 更多