0

可能重复:
javascript 对象,访问变量属性名称?

当某些事件发生时,我试图通过其名称调用对象的方法 - 这是我的代码:

var imageObject = {
    sendImage : function(obj) {
        "use strict";
        var thisId = obj.attr('id');
        var thisSubmit = obj.attr('data-submit');
        var thisCallback = obj.attr('data-callback');
        var thisUrl = $('#' + obj.attr('data-url')).text();
        new AjaxUpload(thisId, {
            action: thisUrl,
            name: 'thisfile',
            onSubmit: imageObject.thisSubmit,
            onComplete: imageObject.thisCallback
        });
    }
}

我还想将参数传递给提交和回调方法。

目前没有任何反应,我确定我说的不对 - 谁能解释如何实现这一目标?

我还使用以下提交和完成:

onSubmit: function(file, extension) {
    imageObject.thisSubmit(file, extension);
},
onComplete: function(file, response) {
    imageObject.thisCallback(file, response);
}

但我得到的是错误说:

imageObject.thisSubmit is not a function

属性仅存储对象中方法的名称(字符串) - 例如“uploadImage”。

4

4 回答 4

3

TJ 的答案几乎就在那里,除了(根据您问题中的新代码)您需要从onSubmitto复制参数thisSubmit,或使用.apply()为您复制它们。

下面的代码使用后一种方法,避免了一遍又一遍地复制函数签名:

new AjaxUpload(thisId, {
    action: thisUrl,
    name: 'thisfile',
    onSubmit: function() {
        imageObject[thisSubmit].apply(imageObject, arguments);
    },
    onComplete: function() {
        imageObject[thisCallback].apply(imageObject, arguments);
    }
});
于 2012-06-25T13:01:11.393 回答
2

如果我正确理解了您的问题,您需要使用方括号语法来访问属性:

new AjaxUpload(thisId, {
    action: thisUrl,
    name: 'thisfile',
    onSubmit: function () { //Anonymous function so you can pass arguments
        imageObject[thisSubmit]("myArg"); //Square brackets here
    },
    onComplete: imageObject[thisCallback] //Square brackets here (no arguments)
});
于 2012-06-25T12:46:16.103 回答
1

我假设thisSubmitthisCallback局部变量是存在于imageObject.

使用这些字符串中的名称调用这些方法,并传入参数,您使用括号语法和闭包的组合:

var imageObject = {
    sendImage : function(obj) {
        "use strict";
        var thisId = obj.attr('id');
        var thisSubmit = obj.attr('data-submit');
        var thisCallback = obj.attr('data-callback');
        var thisUrl = $('#' + obj.attr('data-url')).text();
        new AjaxUpload(thisId, {
            action: thisUrl,
            name: 'thisfile',
            onSubmit: function() {
                imageObject[thisSubmit](arg, anotherArg, etc);
            },
            onComplete: function() {
                imageObject[thisCallback](arg, anotherArg, etc);
            }
        });
    }
    // Presumably there are more methods here, or added later...
}
于 2012-06-25T12:52:33.660 回答
-1

你必须call在 js 中使用 which 调用函数

onSubmit: function(file, extension) {
    imageObject.thisSubmit.call(undefined, file,extension);
},

请参阅call 和 apply 有什么区别?

于 2012-06-25T12:53:48.890 回答