少し書きました。私は自分のアプリケーションのほとんどでそれを使用する:
Object.lookup = (function _lookup() {
var cache = { };
return function _lookupClosure(lookup, failGracefully) {
var check = null,
chain = [ ],
lastkey = '';
if(typeof lookup === 'string') {
if(cache[ lookup ]) {
chain = cache[ lookup ].chain;
check = cache[ lookup ].check;
}
else {
lookup.split(/\./).forEach(function _forEach(key, index, arr) {
if(check) {
if(typeof check === 'object') {
if(key in check) {
chain.push(check = check[ key ]);
lastkey = key;
}
else {
if(!failGracefully) {
throw new TypeError('cannot resolve "' + key + '" in ' + lastkey);
}
}
}
else {
if(!failGracefully) {
throw new TypeError('"' + check + '" ' + ' does not seem to be an object');
}
}
}
else {
lastkey = key;
chain.push(check = window[ key ]);
}
});
if(check) {
cache[ lookup ] = {
chain: chain,
check: check
};
}
}
}
return {
execute: function _execute() {
return typeof check === 'function' ? check.apply(chain[chain.length - 2], arguments) : null;
},
get: function _get() {
return check;
}
};
}
}());
用法:
Object.lookup('namespace.fun1.fun2.fun3').execute();
最初のパラメータは、解決するために、オブジェクト/メソッド/プロパティです。 2番目の(オプションの)パラメータは、lookup()
メソッドがサイレントモードで失敗するか、一部のプロパティまたはオブジェクトが解決できなかった場合に例外をスローするかどうかを示します。デフォルトは 'throw'です。 .fun3
が関数である場合、そのコール
Object.lookup('namespace.fun1.fun2.fun3', true).execute('with', 'paras');
を回避するために、あなたの代わりに.execute()
に任意のパラメータを渡すことができます。 あなただけのプロパティ値を受信したい場合は、あなたも.get()
代わりの.execute()
var val = Object.lookup('namespace.fun1.fun2.fun3').get();
これは、これが必要とするはるかに複雑な可能性があります。 –
@Squeegy:「複雑な」部分は表示されません。おそらくローカルのキャッシュですか?あなたがそのような関数をかなりたくさん使っているのなら、それはかなり良い考えです。 – jAndy
素晴らしい、ありがとうございます – Harry