Javascript jQuery函数作为对象的属性值

Javascript jQuery函数作为对象的属性值,javascript,jquery,function,object,Javascript,Jquery,Function,Object,我在一个对象中有一个对象,该对象包含一个值为jQuery函数的属性: var fields = { id: {}, timeStarted: {}, duration: {}, status: {}, name: { field: $("#companyName"), changeEvent: $("#companyName").on("click", function(){ alert("bazin

我在一个对象中有一个对象,该对象包含一个值为jQuery函数的属性:

var fields = {
    id: {},
    timeStarted: {},
    duration: {},
    status: {},
    name: {
        field: $("#companyName"),
        changeEvent: $("#companyName").on("click", function(){
            alert("bazinga!");
        })
    }
};
我还有另一个函数,它遍历
字段中的所有值,并尝试注册更改事件:

function registerChangeEvents(){
    $.each(fields, function(field, v){
        $.each(v, function(prop, vv){
            // check which property the loop is on: if changeEvent
            if (prop == "changeEvent"){
                vv();
            }
        });
    });
}
但是,当我运行
registerChangeEvents()
时,控制台返回
UncaughtTypeError:object不是函数
。我可以用
function(){…}
包装
changeEvent
的值,这将使它成为一个运行良好的函数。但出于某种原因,这似乎不是正确的方法

如果你有任何想法,请告诉我

谢谢。

当您有这个:

changeEvent: $("#companyName").on("click", function(){
    alert("bazinga!");
})
立即执行代码,
.on()
的结果是原始选定的对象…它只是
$(“#公司名称”)
。因此,
changeEvent
被设置为一个jQuery对象,其中包含id为
companyName的元素

我会将
名称
更改为:

name: {
    field: "#companyName",
    changeEvent: function(){
        alert("bazinga!");
    }
}
然后将函数更改为:

function registerChangeEvents(){
    $.each(fields, function(prop, v){
        var field, changeEvent;
        $.each(v, function(propp, vv){
            if (propp === "field") field = vv;
            if (propp === "changeEvent") changeEvent = vv;
        });
        if (field && changeEvent) $(field).on("change", changeEvent);
    });
}

我对一件事感到困惑-您称之为“changeEvent”,但原始代码中的
事件
用于“单击”。

如果您希望注册更改事件,您需要包装单击处理程序附件:

name: {
    field: $("#companyName"),
    changeEvent: function() {
        this.field.on("click", function(){
            alert("bazinga!");
        });
    }
}
那么就这样称呼它:

$.each(fields, function(field, v) {
    if ($.isFunction(v.changeEvent)) {
        v.changeEvent();
    }
}

谢谢你的回答。我假设我的第一个建议(将
changeEvent
值包装在javascript函数中)是最好的,在这种情况下?另外,我很抱歉没有在前面提到这一点,但是
registerChangeEvents()
将在进行某个ajax调用后触发。不同的
字段
将具有不同的
changeEvents
,它们不限于
单击
s,这就是我之所以这样称呼它的原因。例如,我使用的是Bootstrap的伪单选按钮,它不会触发本机更改事件。调用
registerChangeEvents()
,这样我就可以为我将通过Ajax调用的所有字段设置这些更改事件。这不是一个函数,而是调用这些jQuery函数的结果(结果是一个jQuery包装器对象)。在匿名函数中包装调用是一个好办法(除非您想使用
$.fn.click.bind($(“#companyName”)、alert.bind(窗口,“bazinga!”)