JavaScript通过名称调用对象方法

JavaScript通过名称调用对象方法,javascript,object,methods,Javascript,Object,Methods,可能重复: 当某个事件发生时,我试图按对象的名称调用该对象的方法-以下是我的代码: var imageObject = { sendImage : function(obj) { "use strict"; var thisId = obj.attr('id'); var thisSubmit = obj.attr('data-submit'); var thisCallback = obj.attr('data-call

可能重复:

当某个事件发生时,我试图按对象的名称调用该对象的方法-以下是我的代码:

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”。

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

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

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

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

我假设
thisSubmit
thisCallback
局部变量是
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...
}

我假设
thisSubmit
thisCallback
局部变量是
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...
}

您必须使用
call
调用js中的函数

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

请参见您必须使用
call
调用js中的函数

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

参见

TJ的答案就在那里,除了(根据您问题中的新代码)您需要将参数从提交时的
复制到提交时的
中,或者使用
.apply()
为您复制它们

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

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

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

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

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



data submit
的值是函数还是字符串?@Alnitak
.attr
返回一个字符串而不进行任何处理:P@Esailija是的,我读的是
.data()
,它可以返回任何东西。请不要再发送任何接近票数的票数-这个问题有细微差别,因此它不是重复的!
data submit
的值是函数还是字符串?@Alnitak
.attr
返回一个字符串而不进行任何处理:P@Esailija是的,我读的是
.data()
,它可以返回任何东西。请不要再发送任何接近票数的票数-这个问题有细微差别,因此它不是重复的!是的,这是合理的,如果这些变量实际上是字符串。不过,这个问题很不清楚!但是,不解决将参数传递给它们的问题。@Alnitak-True。我假设
attr
是jQuery
attr
方法,它总是返回字符串。但是实际上没有提到jQuery,所以它可以是任何东西。@T.J.Crowder-也是真的,编辑过。对不起,伙计们-是的,属性只在对象中存储方法的名称(字符串)-因此它将是例如“uploadImage”。是的,这是合理的,如果这些变量实际上是字符串。不过,这个问题很不清楚!但是,不解决将参数传递给它们的问题。@Alnitak-True。我假设
attr
是jQuery
attr
方法,它总是返回字符串。但是实际上没有提到jQuery,所以它可以是任何东西。@T.J.Crowder-也是真的,经过编辑。对不起,伙计们-是的,属性只在对象中存储方法的名称(字符串)-因此它将是例如“uploadImage”。嗯,不,你没有。给定一个函数引用,如果要在调用该函数时更改该函数中的
值,或者如果要将参数作为数组提供(使用
.apply
),则只需使用
.call
.apply
。为什么不使用
imageObject.thisSubmit(文件,扩展名)
?@FelixKling它必须是
imageObject[thisSubmit](文件,扩展名)
@Alnitak:啊,是的,这就是我的意思:)所以答案在任何方面都是错的,事实上……嗯,不,你没有。给定一个函数引用,如果要在调用该函数时更改该函数中的
值,或者如果要将参数作为数组提供(使用
.apply
),则只需使用
.call
.apply
。为什么不使用
imageObject.thisSubmit(文件,扩展名)
?@FelixKling它必须是
imageObject[thisSubmit](文件,扩展名)
@Alnitak:啊,是的,这就是我的意思:)所以答案在任何方面都是错误的,实际上…是的-这正是属性返回并分配给变量的内容。是的-这正是属性返回并分配给变量的内容。我所做的只是:onSubmit:function(file,extension){imageObject[thisSubmit](file,extension);},onComplete:function(file,response){imageObject[thisCallback](file,response);}@SpencerMark是的,这很有效,但这就是我所说的必须复制函数签名的意思。
.apply()
方法使新代码与函数签名完全无关-它根本不会出现在代码中。@Alnitak-+1,很好地解决了问题的实际问题@斯宾塞马克-我认为这应该是公认的答案。如果你接受这个而不是我的,我会删除我的帖子。@jamesalardice相信我,这不容易!;-)不需要删除你的答案,tho