我遇到了需要将对象的方法作为回调传递的问题,该方法使用this
。显然这不起作用,因为当作为回调调用(而不是通过拥有对象)时,this
将指向全局对象。
我读到了这个问题的解决方案,我想知道最好或最常见的是什么。
目前,我的班级'看起来像这样:
function MyClass(value) {
this.value = value;
}
MyClass.prototype.alertValue = function() {
alert(this.value);
};
选项A - 将类更改为如下所示:
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);
}
解决此问题的最常用方法是什么?它的优点和缺点是什么?我提出的两种方式似乎都不优雅,还有另一种方式吗?
答案 0 :(得分:1)
我建议使用bind()。请记住,IE< = 8不支持Function.prototype.bind()
,因此您需要使用polyfill。如果必须为单个类绑定一堆方法,请查看Underscore/lodash's _.bindAll()
method。
例如:
_.bindAll(myObj, 'alertValue', 'otherMethod', 'anotherMethod')