JavaScript调用对象方法的名称

时间:2012-06-25 12:43:03

标签: javascript object methods

  

可能重复:
  javascript object, access variable property name?

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

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
        });
    }
}

我还想将参数传递给submit和callback方法。

目前没有任何事情发生,我确信我没有正确地说 - 有人能解释如何实现这个目标吗?

我还使用以下内容提交并完成:

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

但我得到的是错误说:

imageObject.thisSubmit is not a function

这些属性只存储方法中方法的名称(字符串) - 因此它就是'uploadImage'。

4 个答案:

答案 0 :(得分:3)

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

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

new AjaxUpload(thisId, {
    action: thisUrl,
    name: 'thisfile',
    onSubmit: function() {
        imageObject[thisSubmit].apply(imageObject, arguments);
    },
    onComplete: function() {
        imageObject[thisCallback].apply(imageObject, arguments);
    }
});

答案 1 :(得分: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)
});

答案 2 :(得分: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...
}

答案 3 :(得分:-1)

你必须使用call来调用js中的函数

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

请参阅What is the difference between call and apply?