2011-10-20 50 views
5

我有一個問題,我想創建一個JavaScript類:類使用JavaScript中的原型

function Calculatore(txt,elements) { 
    this.p= new Processor(); 
    this.output=txt; 
    $(elements).click(this.clickHandler); 

} 
Calculatore.prototype.clickHandler = function() { 
var element=$(this); 

// Code Here 

// "this" contains the element. 
// But what if I want to get the "output" var? 
// I tried with Calculatore.prototype.output but no luck. 

} 

所以,我怎麼能解決這個問題?

回答

3

你有this值之間的衝突。您目前無權訪問實例,因爲this已設置爲點擊處理程序中的元素。

你可以做代理功能,同時通過this值(元素)和實例:

function Calculatore(txt,elements) { 
    this.p= new Processor(); 
    this.output=txt; 
    var inst = this; // copy instance, available as 'this' here 

    $(elements).click(function(e) { 
     return inst.clickHandler.call(this, e, inst); // call clickHandler with 
                 // 'this' value and 'e' 
                 // passed, and send 'inst' 
                 // (the instance) as well. 
                 // Also return the return 
                 // value 
    }); 

} 

Calculatore.prototype.clickHandler = function(e, inst) { 
    var element = $(this); 

    var output = inst.output; 
}; 
+0

哦,你救了我的頭髮,謝謝! – elios264

3

您可以使用jQuery的$.proxy

function Calculatore(txt,elements) { 
    this.p= new Processor(); 
    this.output=txt; 
    $(elements).click($.proxy(this.clickHandler, this)); 
} 

Calculatore.prototype.clickHandler = function(event) { 
    var clickedElement = event.target; 
    alert(this.output); 
} 

編輯。傑森在評論中提出了一個很好的觀點。使用event.target可能更好,它只引用單擊的元素,而不是elements,它可能會引用與選擇匹配的對象數組。

+1

或使用'event.target'而不是保存元素(事件是clickHandler中的第一個參數) –

+0

@Jason,是的好電話。 – hyperslug

+0

請注意,event.target(W3C規範)與IE不兼容 - 您還必須檢查event.srcElement。 –