Javascript 使用事件侦听器从对象调用函数

Javascript 使用事件侦听器从对象调用函数,javascript,dom-events,Javascript,Dom Events,我有这样一个视图模型: CANVAS = getElementById... RemixView = function(attrs) { this.model = attrs.model; this.dragging = false; this.init(); }; RemixView.prototype = { init: function() { CANVAS.addEventListener("click", t

我有这样一个视图模型:

CANVAS = getElementById...

RemixView = function(attrs) {
     this.model = attrs.model;
     this.dragging = false;
     this.init();
};

RemixView.prototype = {
    init: function() {
        CANVAS.addEventListener("click", this.handleClick);
    },
    handleClick: function(ev) {
        var obj = this.getHoveredObject(ev);
    },
    getHoveredObject: function(ev) {}
    ...
    ...
}
rv = new RemixView()
问题是当触发clickHandler事件时,该对象等于CANVAS对象,而不是RemixView。所以我得到一个错误,它说:

this.getHoveredObject不是函数


正确的方法是什么?

通常的方法是对回调使用一个简单的闭包,并在闭包可以引用的局部变量中捕获该闭包的适当值:

RemixView.prototype = {
    init: function(this) {
        var _this = this;
        CANVAS.addEventListener("click", function(ev) {
            return _this.handleClick(ev);
        });
    },
    //...
};
您还可以使用创建绑定函数,如下所示:

或者,如果您想使用ES6,您可以使用:


通常的方法是对回调使用一个简单的闭包,并在闭包可以引用的局部变量中捕获相应的值:

RemixView.prototype = {
    init: function(this) {
        var _this = this;
        CANVAS.addEventListener("click", function(ev) {
            return _this.handleClick(ev);
        });
    },
    //...
};
您还可以使用创建绑定函数,如下所示:

或者,如果您想使用ES6,您可以使用:

您想创建处理程序函数:

CANVAS.addEventListener("click", this.handleClick.bind(this));
请注意,这在较旧的浏览器中可能不起作用,但在那些浏览器中是有作用的。

您希望处理程序函数:

CANVAS.addEventListener("click", this.handleClick.bind(this));
请注意,这在较旧的浏览器中可能不起作用,但在那些浏览器中是有作用的。

使原型成为一个函数

RemixView.prototype = function () {
    init: function() {
        CANVAS.addEventListener("click", this.handleClick);
    },
    handleClick: function(ev) {
        var obj = this.getHoveredObject(ev);
    } ///...
//...
}
使原型成为一个函数

RemixView.prototype = function () {
    init: function() {
        CANVAS.addEventListener("click", this.handleClick);
    },
    handleClick: function(ev) {
        var obj = this.getHoveredObject(ev);
    } ///...
//...
}

在这里,您将原型定义为函数,但其行为类似于对象。我认为init:必须是this.init=函数{…}?这里您将原型定义为函数,但其行为类似于对象。我认为init:一定是这个。init=函数{…}?问题不是关于绑定事件,从handleClick方法调用getHoveredObject方法。我的答案不是关于绑定事件。问题不是关于绑定事件,从handleClick方法调用getHoveredObject方法。我的答案不是关于绑定事件。