2011-12-01 107 views
4

有沒有做從以下....引用自己的對象屬性

var myObject = { 
    name: "Johnny", 
    init: function() { 
     $("body").mousemove(this.setStatus); 
    }, 
    setStatus: function(ev) { 
     $("body").append("<div>Mouse Move by: " + myObject.name + "</div>"); 
    } 
}; 

myObject.init(); 

這是這樣引用當創建一個類的對象的財產的最好方式(即調用myObject.name問題setStatus函數)?

回答

1

這很好。如果setStatus未在其他地方使用,則可以將其移至匿名函數並將其傳遞至mousemove

2

它看起來就像你知道,當this.setStatus被觸發變量this上下文將把接收到事件的元素(即你的<body>),而不是myObject

但是你真的不應該在對象本身中引用myObject - 對象應該不知道它在它自己之外被稱爲什麼。

要解決,你可以通過this作爲附加參數.mouseMove這樣的:

$("body").mousemove(this, this.setStatus); 

,然後你的事件處理程序中,你可以檢索通過事件的data領域當前的對象引用:

setStatus: function(ev) { 
    var self = ev.data; 
    $("body").append("<div>Mouse Move by: " + self.name + "</div>"); 
} 
+0

爲什麼不應該對象引用自身?你有建議這樣做的技術原因嗎? –

+0

@JohnnyRambo這是糟糕的OO設計。你目前可以做'var tmp = myObject; myObject = null',你的代碼就會中斷。我所建議的更改將您的實現的_internals_從_external_引用中分離出來,通過該引用您的對象已知,並允許代碼繼續工作。 – Alnitak

+0

我想到了,但我以這種方式創建對象的原因是因爲不會有該類的任何其他實例,也不會將其設置爲null。儘管如此,我仍然會將你所建議的改變變得更安全。謝謝。 –

0

您需要確保this仍然可用。將函數傳遞給事件處理函數時,this將指向相關的DOM節點。

既然你使用jQuery,您可以使用$.proxy()綁定this功能裏面別的東西:

$("body").mousemove($.proxy(this.setStatus, this)); 

然而,這將是更清潔,使可以從別的途徑原this

var myObject = { 
    name: "Johnny", 
    init: function() { 
     var self = this; 
     $("body").mousemove(function(ev) { 
      self.setStatus.call(this, ev, self); 
     }); 
    }, 
    setStatus: function(ev, self) { 
     $("body").append("<div>Mouse Move by: " + self.name + "</div>"); 
    } 
}; 
+0

可以工作,但是隨後打破了事件處理程序中的'this'引用接收事件的元素的約定。 – Alnitak

0

這種方式很好。這樣做是隻傳遞一個匿名函數來鼠標移動的另一種方法:

var myObject = { 
    name: "Johnny", 
    init: function() { 
     var thisObject = this; 
     $("body").mousemove(function() { 
      $("body").append("<div>Mouse Move by: " + thisObject.name + "</div>"); 
     }); 
    } 
}; 

myObject.init(); 

fiddle