Javascript 手柄';这';事件内侦听器

Javascript 手柄';这';事件内侦听器,javascript,javascript-events,Javascript,Javascript Events,但是在onclick中,这个绑定到映射。我希望它绑定到Foo的实例。 请注意,我不能将匿名函数用作addEvent的第二个参数,因为我以后需要删除侦听器。这应该会给出您想要的结果。通过在匿名函数中创建对象,可以获得对它的引用 function Foo(map){ this.map = map; } Foo.prototype = { onclick: function(e){ this.bar(e.point); }, bar: funct

但是在
onclick
中,
这个
绑定到
映射
。我希望它绑定到
Foo
的实例。

请注意,我不能将匿名函数用作
addEvent
的第二个参数,因为我以后需要删除侦听器。

这应该会给出您想要的结果。通过在匿名函数中创建对象,可以获得对它的引用

function Foo(map){
    this.map = map;
}  
Foo.prototype = {
    onclick: function(e){
        this.bar(e.point);
    },  
    bar: function(point){
        // do something with point
    },  
    start: function(){
        this.map.addEvent("click", this.onclick);
    },
    stop: function(){
        this.map.removeEvent("click", this.onclick);
    }
};  

示例-(忽略警报的内容,重要的是它到达了那里!)

这应该会给出您想要的结果。通过在匿名函数中创建对象,可以获得对它的引用

function Foo(map){
    this.map = map;
}  
Foo.prototype = {
    onclick: function(e){
        this.bar(e.point);
    },  
    bar: function(point){
        // do something with point
    },  
    start: function(){
        this.map.addEvent("click", this.onclick);
    },
    stop: function(){
        this.map.removeEvent("click", this.onclick);
    }
};  
示例-(忽略警报的内容,重要的是它到达了那里!)

start()
中,创建一个通过本地别名引用外部对象的闭包:

Foo.prototype = (function() {
    var f = { }
    f.onclick = function(e){
        f.bar(e.point);
    };
    f.bar = function(point){
        // do something with point
    };  
    f.start = function(){
        this.map.addEvent("click", f.onclick);
    };
    f.stop = function(){
        this.map.removeEvent("click", f.onclick);
    };
    return f;
})();  
start()
中,创建通过本地别名引用外部对象的闭包:

Foo.prototype = (function() {
    var f = { }
    f.onclick = function(e){
        f.bar(e.point);
    };
    f.bar = function(point){
        // do something with point
    };  
    f.start = function(){
        this.map.addEvent("click", f.onclick);
    };
    f.stop = function(){
        this.map.removeEvent("click", f.onclick);
    };
    return f;
})();  

您可以更改调用事件处理程序的方式。例如(如果使用jQuery):


您可以更改调用事件处理程序的方式。例如(如果使用jQuery):


这个答案与Richard D的答案类似,但由于我们希望原型返回一个新对象,我们可以将其初始化为一个:

$("foo").click((function () {
    var fooObject = new Foo;
    return function (evt) {
        fooObject.onclick.call(fooObject, evt);
    };
}()));

这个答案与Richard D的答案类似,但由于我们希望原型返回一个新对象,我们可以将其初始化为一个:

$("foo").click((function () {
    var fooObject = new Foo;
    return function (evt) {
        fooObject.onclick.call(fooObject, evt);
    };
}()));

start
中的
this
是否仍然引用
Foo
的实例?@wong2是的,它似乎是-单击在两个分区上都能正确工作
中的
this
仍然引用
Foo
的实例?@wong2是的,它似乎是-单击在两个分区上都能正确工作