2012-06-25 107 views
0

可能重複方法:
javascript object, access variable property name?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'。

+0

是'數據submit'的功能或字符串的值? – Alnitak

+0

@Alnitak'.attr'返回一個沒有任何處理的字符串:P – Esailija

+0

@Esailija是的,我正在讀它作爲'.data()',它可以返回任何東西。 – Alnitak

回答

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

我做的只是這個:onSubmit:function(文件,擴展名){ \t \t \t \t imageObject [thisSubmit](file,extension); \t \t \t}, \t \t \t的onComplete:功能(文件,響應){ \t \t \t \t imageObject [thisCallback](文件,響應); \t \t \t} –

+0

@SpencerMark是的,這有效,但是我的意思是不得不復制函數簽名。 '.apply()'方法使新代碼完全不知道函數簽名 - 它從來沒有出現在代碼中。 – Alnitak

+0

@Alnitak - +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) 
}); 
+0

是的,這是合理的,如果這些變量實際上是字符串。雖然這個問題很不明確! – Alnitak

+0

但是,不會將傳入的參數傳遞給它們。 –

+0

@Alnitak - 確實如此。我假設'attr'是jQuery'attr'方法,它總是返回一個字符串。但實際上沒有提及jQuery,所以它可能是任何東西。 –

1

我假設thisSubmitthisCallback局部變量的意思是名稱​​上存在的功能。

不要使用那些字符串名稱都調用這些方法,並傳遞參數,您使用括號語法和閉包的組合:

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... 
} 
+0

是的 - 這正是屬性返回並分配給變量的原因。 –

-1

,你必須使用call它調用一個函數在JS

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

看到What is the difference between call and apply?

+0

恩,不,你沒有。給定一個函數引用,如果你想在被調用的時候改變該函數中this的值,只需要使用'.call'或'.apply'。 – Alnitak

+0

或者如果你想提供參數作爲數組(使用'.apply') – Alnitak

+0

爲什麼不''imageObject.thisSubmit(file,extension)'? –

相關問題