我有一个无法解决的问题。
上下文是:我想要一个继承链,属于这个继承的对象的方法必须是事件处理程序,同时能够到达对象的属性。
我正在尝试编写没有“新”字的 JavaScript,而是使用带有一些继承层次结构的 Object.create()。所以首先采用这种方法。
所以我有一个其余对象的蓝图(myProto),然后我用 Object.create 创建对象(这样就没有闭包可以做分配this
给that
or的技巧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 表单,在闭包中分配它然后访问它会很容易,但是 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
基本上问题是:
如何使用对象的方法作为事件处理程序,并且仍然能够访问该对象?