jQuery:当对象方法被称为回调时,如何传递对象上下文?

时间:2015-11-04 21:02:54

标签: javascript jquery callback bind

我有一个对象:

var Person = function(name, age) {
    this.name = name;
    this.age = age;
}

Person.prototype.sayHello = function() {
    console.log("Hello" + this.name + ", " + this.age);
}
var sam = new Person("Sam", 31);

我想将Person.sayHello称为onclick回调,我发现我可以使用bind方法。

$("#button").on("click", Person.sayHello.bind(sam));

也许有更多的通用解决方案或jQuery的一些特定方法来解决jQuery的这个问题?

我需要添加一个注释。我可以拥有Person类的多个实例,并且我希望使click能够为所有这些实例工作。我想到了所有Person实例的一些循环并将它们绑定到回调。

1 个答案:

答案 0 :(得分:1)

由于您正在使用jQuery,因此可以使用jQuery.proxy()方法,该方法专门用于附加事件处理程序并保持this完整。所以,像:

$('#button').on('click', $.proxy(sam, 'sayHello'));

但是,如果您要通过单击按钮循环浏览一堆,您甚至不需要担心所有这些。

var sam = new Person("Sam", 31);
var bob = new Person("Bob", 32);
var pat = new Person("Pat", 33);
var people = [sam,bob,pat];
$('#button').on('click', function () {
    people.forEach(function (person) {
        person.sayHello();
    });
});

这假设一个支持Array.prototype.forEach的相对较新的浏览器。基本上,那些People对象已经知道他们正在做什么。

如果您需要支持旧浏览器,请将forEach更改为:

$.each(people, function (i, person) {
    person.sayHello();
});

感谢@dandavis提示。