我想要一个对象,它可以作为一个注册表来调用它的函数。
到目前为止,我一直在考虑以下几点:
var registry = new Object();
registry.doStuff = function(){ /* */ };
有没有更好的办法 ?添加对象呢?理想情况下,我希望能够在运行时添加这些。
沿着这些思路怎么样(这就像用其他语言(如 Java)声明一个类):
var Registry = function (instanceVariable1) {
//Initialize any instance variables here (e.g. the registry data)
this.instanceVariable1 = instanceVariable1;
};
然后声明一个函数:
Registry.prototype.doStuff = function () {
//do stuff here
};
像这样称呼它:
var registry = new Registry(...); //pass in parameters here to initialize the Registry object with data
registry.doStuff();
简要说明:所有 Javascript 对象都有一个prototype
和 当您尝试通过 访问属性时obj['propertyName']
,如果该属性不存在,prototype
则会检查 。使用原型允许您创建Registry
对象的新实例,而不必每次都重新声明其功能。更多信息:JavaScript .prototype 如何工作?.
根据具体情况,您可能希望将函数添加到对象本身或其原型中。
将函数添加到对象的原型可以避免每次创建新对象时重新创建这些函数。否则,将为每个新对象重新创建函数。然而,如果您希望您的函数能够访问构造函数中的局部变量,这可能是有利的。
扩展 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