Search code examples
javascriptoopdesign-patternsextjs3

Aliasing a function object in JavaScript


Disclaimer: I am using ExtJS 3, but I don't think it's very relevant to the question, outside of the common use of it's namespacing function.

I have a singleton that's declared in a really long namespace like this:

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();

I use it in other modules via calls like REALLY.REALLY.LONG.NAMESPACE.Singleton.otherFunction(); and REALLY.REALLY.LONG.NAMESPACE.Singleton.publicFunction(myObject); . I'm wondering if I can swap out those calls by setting up the client module with an alias to the singleton, i.e. var singleton = REALLY.REALLY.LONG.NAMESPACE.Singleton; , so that I can call singleton.otherFunction();. I'm wondering if this is an anti-pattern , or if there are any pitfalls (memory?) I might run into through this usage.

Thanks StackOverflow!


Solution

  • I'm wondering if I can swap out those calls by setting up the client module with an alias to the singleton

    Yes, you can.

    I'm wondering if this is an anti-pattern , or if there are any pitfalls (memory?) I might run into through this usage.

    No, there aren't any that I can think of and it is faster than calling the fully-qualified version.

    Local Alias Pattern


    Example:

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

    Or:

    (function somfunc(singleton){
    
    }(REALLY.REALLY.LONG.NAMESPACE.Singleton));
    

    Test Results:

    http://jsfiddle.net/jMg9A/