概要
Javascriptで名前空間を簡単につかう方法を考えてみたよ。
ヘルパー関数を作る
追記:実際つかってたら動かないことに気付いたので修正した。使用例はそのまま動くはず。
(function() {
function splitNs(nsStr) {
return nsStr.split(".");
}
function ret(nsStr) {
function ret_helper(rt, symo) {
if(symo.length > 0) {
var now = symo.shift();
if(!(Object.prototype.toString.call(rt[now]) === '[object Object]')) {
rt[now] = {};
}
return ret_helper(rt[now], symo);
} else {
return rt;
}
}
return ret_helper(window, splitNs(nsStr));
}
window.use = function(nsStr, self) {
var nss = splitNs(nsStr);
var obj = self[nss[0]];
for(var i = 1; i < nss.length; i += 1) {
obj = obj[nss[i]];
}
self[nss[nss.length - 1]] = obj;
};
window.ns = function(sym, fn) {
fn.call(ret(sym));
};
})();
使ってみる
- 使用例
ns("a.b", function() {
this.Cls = function() {
function qoo() {
console.log("qoo!");
}
var pub = {};
pub.qoo = qoo;
return pub;
};
});
ns("a.b.c", function() {
this.x = 1;
});
$(document).ready(function() {
(function() {
use("a.b.c", this);
use("a.b.Cls", this);
console.log("c.x", c.x);
(new Cls()).qoo();
})();
});
- 出力
c.x 1
qoo!