【发布时间】:2013-11-06 13:44:32
【问题描述】:
我有一个无法解决的问题。
上下文是:我想有一个继承链,属于这个继承的对象的方法必须是事件处理程序,同时能够到达对象的属性。
我正在尝试编写不带“新”字的 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 形式,在闭包中分配 this 然后访问它会很容易,但是 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 或者没有这些棘手的上下文、闭包等来引用自己的东西......
基本上问题是:
如何使用对象的方法作为事件处理程序,并且仍然能够访问该对象?
【问题讨论】:
标签: javascript oop inheritance this