2015-07-20 67 views
0

對不起,如果這很簡單,但我不能得到它的工作,即使我已經閱讀了許多類似的話題幾個小時。我不知道還有什麼要搜索的。原型回調

我想調用一個回調函數,但是在對象中調用一個回調函數,而不是全局(?)範圍中的函數。

var something = function (x) { 
    this.x = x; 
}; 

something.prototype.alertx = function() { 
    alert(this.x); 
}; 

something.prototype.logx = function() { 
    console.log(this.x); 
}; 

something.prototype.multiplyxby2 = function(callback){ 
    this.x *= 2; 
    callback.call(this); // this is where I am stuck!! 
    // obviously this.callback(); doesn't work either. 
}; 

var foo = new something(20); 
foo.multiplyxby2('logx'); 
// or 
foo.multiplyxby2('alertx'); 

感謝

回答

1

在你的情況要傳遞的功能,被稱爲一個字符串,所以你需要去執行的函數引用。由於函數是this對象的成員,則可以使用括號標記下面給出得到函數參照,然後調用它

var something = function(x) { 
 
    this.x = x; 
 
}; 
 

 
something.prototype.alertx = function() { 
 
    snippet.log('alertx:' + this.x); 
 
}; 
 

 
something.prototype.logx = function() { 
 
    snippet.log('logx:' + this.x); 
 
}; 
 

 
something.prototype.multiplyxby2 = function(callback) { 
 
    this.x *= 2; 
 
    this[callback](); 
 
}; 
 

 
var foo = new something(20); 
 
foo.multiplyxby2('alertx'); 
 
foo.multiplyxby2('logx');
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>


另一種選擇是通過直接函數引用作爲回調等

something.prototype.multiplyxby2 = function (callback) { 
    this.x *= 2; 
    callback.call(this); // this is where I am stuck!! 
    // obviously this.callback(); doesn't work either. 
}; 

var foo = new something(20); 
foo.multiplyxby2(foo.alertx); 
foo.multiplyxby2(foo.logx); 
  1. 列表項
+0

謝謝你,先生!! '這個[callback] .call(this);'和'this。[callback]()'在jfriend00的答案中有什麼區別?只要將上下文傳遞給回調函數? –

+0

@BenA。有沒有....我也已經更新了答案....因爲我們使用的是正確的上下文調用回調沒有必要使用'.CALL()' –

+0

謝謝!很有幫助。 –

2

如果你想傳遞一個方法名字作爲一個字符串,那麼你可以使用[methodname]語法來引用它像this[methodname]();這裏它在你的代碼塊:

var something = function (x) { 
    this.x = x; 
}; 

something.prototype.alertx = function() { 
    alert(this.x); 
}; 

something.prototype.logx = function() { 
    console.log(this.x); 
}; 

something.prototype.multiplyxby2 = function(method){ 
    this.x *= 2; 
    // execute the passed in method 
    this[method](); 
}; 

var foo = new something(20); 
foo.multiplyxby2('logx'); 
// or 
foo.multiplyxby2('alertx'); 
+0

謝謝我的朋友! –