“这个”,在事件方法使用JavaScript原型对象关键字时(“this” keyword in e

2019-06-21 11:32发布

我试图访问一个事件处理程序在JavaScript中的原型类的成员变量 - 这是我通常会使用的关键字“this”(或“说:” [此副本在事件处理程序的情况下) 。 不用说,我遇到了一些麻烦。

举个例子来说,这个HTML片段:

<a id="myLink" href="#">My Link</a>

而这段JavaScript代码:

function MyClass()
{
  this.field = "value"
  this.link = document.getElementById("myLink");
  this.link.onclick = this.EventMethod;
}

MyClass.prototype.NormalMethod = function()
{
  alert(this.field);
}

MyClass.prototype.EventMethod = function(e)
{
  alert(this.field);
}

实例化一个MyClass的对象并调用NormalMethod工作完全像我期望它(警告说“值”),但点击一个未定义值的链接的结果,因为“this”关键字现在引用事件目标(固定件()HTML元素) 。

我是新来的JavaScript原型的风格,但在过去,倒闭,我只是做副本“这个”在构造函数:

var that = this;

然后,我可以通过“说”对象访问事件方法的成员变量。 这似乎不符合原型代码工作。 有另一种方式来实现这一目标?

谢谢。

Answer 1:

你的"that=this"关闭成语仍然适用:

function MyClass()
{
    ...

    var that = this;
    this.link.onclick = function() {
        return that.EventMethod.apply(that, arguments);

        // that.EventMethod() works too here, however
        // the above ensures that the function closure
        // operates exactly as EventMethod itself does.

    };
}


Answer 2:

你需要:

this.link.onclick = this.EventMethod.bind(this);

...“绑定”为原型的一部分,并返回一个与“这个”设置正确调用你的方法的功能。



Answer 3:

你应该试试

this.link.onclick = this.EventMethod.bind(this);


Answer 4:

如上所述,使用绑定是Prototype库的一部分是解决这一问题的一种清洁方式。 这个问题是它与执行绑定方法在这里得到解答,而不包括整个原型库的另一个问题SO重复:

https://stackoverflow.com/a/2025839/1180286



文章来源: “this” keyword in event methods when using JavaScript prototype object