将对象的方法作为回调传递的最好或最常见的方法是什么?
What's the best or most common way to pass an object's method as a callback?
我 运行 遇到了一个问题,我需要将对象的方法作为回调传递,而该方法使用 this
。显然这是行不通的,因为当作为回调调用时(不是通过拥有对象)this
将指向全局对象。
我阅读了有关此问题的解决方案,想知道最好或最常见的解决方案是什么。
目前,我的 'class' 看起来像这样:
function MyClass(value) {
this.value = value;
}
MyClass.prototype.alertValue = function() {
alert(this.value);
};
选项 A - 将 class 更改为如下所示:
function MyClass(value) {
this.value = value;
this.alertValue = function() {
alert(value);
};
}
优点——简单。但缺点是 alertValue
会在每次实例化时被复制,这就是我们通常将方法放在 prototype
.
上的原因
选项 B - 使用 .bind()
:
callbackReceivingFunction(myObject.alertValue.bind(myObject));
我可以为此编写一个实用方法:
function bind(object, methodName) {
return object[methodName].bind(object);
}
解决此问题最常用的方法是什么?它的优点和缺点是什么?我想出的这两种方式似乎都不雅观,还有其他方法吗?
我建议使用 bind()。请记住,IE <= 8 不支持 Function.prototype.bind()
,因此您需要使用 polyfill。如果您必须为单个 class 绑定一堆方法,请查看 Underscore/lodash's _.bindAll()
method.
例如:
_.bindAll(myObj, 'alertValue', 'otherMethod', 'anotherMethod')
我 运行 遇到了一个问题,我需要将对象的方法作为回调传递,而该方法使用 this
。显然这是行不通的,因为当作为回调调用时(不是通过拥有对象)this
将指向全局对象。
我阅读了有关此问题的解决方案,想知道最好或最常见的解决方案是什么。
目前,我的 'class' 看起来像这样:
function MyClass(value) {
this.value = value;
}
MyClass.prototype.alertValue = function() {
alert(this.value);
};
选项 A - 将 class 更改为如下所示:
function MyClass(value) {
this.value = value;
this.alertValue = function() {
alert(value);
};
}
优点——简单。但缺点是 alertValue
会在每次实例化时被复制,这就是我们通常将方法放在 prototype
.
选项 B - 使用 .bind()
:
callbackReceivingFunction(myObject.alertValue.bind(myObject));
我可以为此编写一个实用方法:
function bind(object, methodName) {
return object[methodName].bind(object);
}
解决此问题最常用的方法是什么?它的优点和缺点是什么?我想出的这两种方式似乎都不雅观,还有其他方法吗?
我建议使用 bind()。请记住,IE <= 8 不支持 Function.prototype.bind()
,因此您需要使用 polyfill。如果您必须为单个 class 绑定一堆方法,请查看 Underscore/lodash's _.bindAll()
method.
例如:
_.bindAll(myObj, 'alertValue', 'otherMethod', 'anotherMethod')