あいつの日誌β

働きながら旅しています。

Test-Driven JavaScript Development に記述されている名前空間ユーティリティを実装してみる

Test-Driven JavaScript Development に記述されている名前空間ユーティリティを実装してみる

SEE ALSO

git clone http://tddjs.com/code/06-applied-functions-and-closures.git

test作成

TestCase("NameSpaceTest", {

    tearDown: function () {
        delete MyApp.hoge;
    },

    "test should create non-existent object" :
    function () {
        MyApp.namespace("hoge");
        assertObject(MyApp.hoge);
    },

    "test should not overwrite existing objects":
    function () {
        MyApp.hoge = { fuga: {} };
        var result = MyApp.namespace("hoge.fuga");

        assertSame(MyApp.hoge.fuga, result);
    },

    "test only create missing parts":
    function () {
        var hash = {};
        MyApp.hoge = { fuga: { piyo: hash } };
        var result = MyApp.namespace("hoge.fuga.ui");
        assertSame(hash, MyApp.hoge.fuga.piyo);
        assertObject(MyApp.hoge.fuga.ui);
    }
});

実装

var MyApp = (function () {
    function namespace(string) {
        var object = this;
        var levels = string.split(".");

        for (var i = 0, l = levels.length; i < l; i++) {
            if (typeof object[levels[i]] == "undefined") {
                object[levels[i]] = {}; 
            }   
            object = object[levels[i]];
        }   
        return object;
    }   

    return {
        namespace: namespace
    };  
}());

quick sample

% git clone git@github.com:okamuuu/Practice-JsNameSpace.git
% sh script/jstestdriver.sh