我有一個問題,我無法解決。如何避免「this」引用DOM元素,並引用對象
上下文是:我想要一個繼承鏈,並且屬於這個繼承的對象的方法必須是事件處理程序,並且同時能夠到達對象屬性。
我試圖編寫沒有「新」字的JavaScript,而是使用Object.create()和一些繼承層次結構。所以首先這種方法。
所以,我有我的其餘對象(myProto)的藍圖,然後我創建的Object.create對象(所以沒有封在那裏我可以做到分配this
到that
或self
的伎倆)。現在,當我使用此對象的方法處理例如div上的單擊事件時,this
顯然會引用DOM對象,並且我失去了訪問我的對象屬性的可能性。
var myProto = {
init: function (name, value) {
this.name = name;
this.value = value;
return this;
},
someHandler: function (e) {
// Normally I would use this instead of e.target...
e.target.innerHTML = this.name + this.value; // This does not refer to the object.
}
};
var myObject = Object.create(myProto).init('myName', 'myValue');
document.getElementById('myDiv').onclick = myObject.someHandler;
這裏小提琴:http://jsfiddle.net/pgPHM/
而現在的「經典」的方法:如果我用的是新的構造形式,它會很容易在封閉轉讓本,然後訪問它,但有是在Constructor.prototype
var Constructor = function (name, value) {
var self = this;
self.name = name;
self.value = value;
};
Constructor.prototype.someHandler = function() {/*self does not reach this here*/};
的jsfiddle功能的問題:http://jsfiddle.net/ZcG3J/2/
我真的不知道爲什麼JS對象沒有一個真正的this
或self
或任何稱自己沒有這些棘手的背景下,關閉等...
基本問題是:
如何使用的方法一個對象作爲事件處理程序,並且仍然能夠到達該對象?
如何使用對象的方法作爲事件處理函數,並仍然能夠到達對象? – bgusach
@ ikaros45 - 請參閱我的答案中的選項4。 – jfriend00
@ ikaros45 - 添加了幾個例子。 – jfriend00