関数を呼び出すためのレジストリとして機能できるオブジェクトが必要です。
これまでのところ、私はこれらの線に沿って何かを考えてきました:
var registry = new Object();
registry.doStuff = function(){ /* */ };
より良い方法はありますか?オブジェクトの追加についてはどうですか? 理想的には、これらを実行時に追加できるようにしたいと考えています。
sashain97の答えを拡張するには。
これは、プロトタイプ メソッドを使用して作成した機能の例です。
var Registry = function() {
this.settings = {};
};
Registry.prototype.setValue = function(object, path, value) {
var a = path.split('.');
var o = object;
for (var i = 0; i < a.length - 1; i++) {
var n = a[i];
if (n in o) {
o = o[n];
} else {
o[n] = {};
o = o[n];
}
}
o[a[a.length - 1]] = value;
}
Registry.prototype.getValue = function(object, path) {
var o = object;
path = path.replace(/\[(\w+)\]/g, '.$1');
path = path.replace(/^\./, '');
var a = path.split('.');
while (a.length) {
var n = a.shift();
if (n in o) {
o = o[n];
} else {
return;
}
}
return o;
}
Registry.prototype.set = function(path, value) {
return this.setValue(this.settings, path, value);
};
Registry.prototype.get = function(path) {
return this.getValue(this.settings, path);
};
いくつかの例:
変数を設定:
var registry = new Registry();
registry.set('key1.var1', 'value');
alert( registry.get('key1.var1') );
//alerts: value
設定方法:
registry.set('key1.f1', function(message, suffix){alert(message + suffix);} );
registry.get('key1.f1')('hello', ' world');
//alerts: hello world
状況によっては、オブジェクト自体またはそのプロトタイプに関数を追加することもできます。
関数をオブジェクトのプロトタイプに追加すると、新しいオブジェクトが作成されるたびにそれらの関数を再作成する必要がなくなります。それ以外の場合、関数は新しいオブジェクトごとに再作成されます。それにもかかわらず、関数がコンストラクター内のローカル変数にアクセスできるようにする場合は、これが有利な場合があります。