Jquery 用于调用方法和对象的Javascript注册表

Jquery 用于调用方法和对象的Javascript注册表,jquery,function,registry,Jquery,Function,Registry,我想有一个对象,它可以作为一个注册表调用它的函数 到目前为止,我一直在思考以下问题: var registry = new Object(); registry.doStuff = function(){ /* */ }; 有更好的办法吗?添加对象怎么样?理想情况下,我希望能够在运行时添加这些内容。这样做如何(这就像用Java等其他语言声明一个类): 然后声明一个函数: Registry.prototype.doStuff = function () { //do stuff her

我想有一个对象,它可以作为一个注册表调用它的函数

到目前为止,我一直在思考以下问题:

var registry = new Object();

registry.doStuff = function(){ /* */ };

有更好的办法吗?添加对象怎么样?理想情况下,我希望能够在运行时添加这些内容。

这样做如何(这就像用Java等其他语言声明一个类):

然后声明一个函数:

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对象都有一个
原型
,当您试图通过
obj['propertyName']
访问某个属性时,如果该属性不存在,将改为检查
原型
。使用原型可以创建
注册表
对象的新实例,而无需每次重新声明其函数。更多信息:。

按照这些思路(这就像用Java等其他语言声明一个类):

然后声明一个函数:

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对象都有一个
原型
,当您试图通过
obj['propertyName']
访问某个属性时,如果该属性不存在,将改为检查
原型
。使用原型可以创建
注册表
对象的新实例,而无需每次重新声明其函数。更多信息:。

根据具体情况,您可能希望将函数添加到对象本身或其原型中


将函数添加到对象的原型可以避免在每次创建新对象时重新创建这些函数。否则,将为每个新对象重新创建函数。然而,如果您希望函数能够访问构造函数中的局部变量,这可能是有利的。

根据情况,您可能希望将函数添加到对象本身或其原型中


将函数添加到对象的原型可以避免在每次创建新对象时重新创建这些函数。否则,将为每个新对象重新创建函数。然而,如果您希望函数能够访问构造函数中的局部变量,这可能是有利的。

展开sashain97的答案

下面是我使用prototype方法创建的一个功能示例

        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);
        };
设置方法:

    registry.set('key1.f1', function(message, suffix){alert(message + suffix);} );
    registry.get('key1.f1')('hello', ' world');
    //alerts: hello world

进一步阐述sashain97的答案

下面是我使用prototype方法创建的一个功能示例

        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);
        };
设置方法:

    registry.set('key1.f1', function(message, suffix){alert(message + suffix);} );
    registry.get('key1.f1')('hello', ' world');
    //alerts: hello world

我对这个代码没意见,但我有问题!使用var registry=newobject({doStuff=func});你使用的是什么版本的IE?我根本不使用IE,但我认为在我的一个项目中,我有和你一样的解决方案,IE 6 7 8也有类似的问题definition@JamesPoulson我的答案有问题吗?没有。一点问题都没有,这就是为什么它得到了+1。只是习惯于等待更多的答案。耐心;)我对这个代码没意见,但我有问题!使用var registry=newobject({doStuff=func});你使用的是什么版本的IE?我根本不使用IE,但我认为在我的一个项目中,我有和你一样的解决方案,IE 6 7 8也有类似的问题definition@JamesPoulson我的答案有问题吗?没有。一点问题都没有,这就是为什么它得到了+1。只是习惯于等待更多的答案。耐心;)你能简单解释一下原型是关于什么的吗?为什么在这里使用它?你能简单地解释一下原型是关于什么的吗?为什么在这里使用它?