设置“this"到实例,在创建原型函数期间的回调集中
Setting "this" to the instance, in a callback set during the creation of a prototype function
我有这样的代码:
var createAllAreSelectedClickedHandler = function(selectablesArrayGetter) {
return function() {
var array = selectablesArrayGetter();
var desiredState = array.every(function(selectable) { return selectable.selected; }) ? false : true;
array.forEach(function(selectable) {
selectable.selected = desiredState;
});
};
};
后面接这个
function PromoViewModel() { this.registrations = [...] }
PromoViewModel.prototype.allEventsSelectedClickedHandler = createAllAreSelectedClickedHandler(function() { return this.registrations; }));
我无法设置正确的值。当函数被创建时,"this"值指向Window,所以我不能执行.bind(this)。我试过做。bind(PromoViewModel.prototype),但它缺乏构造函数内设置的所有宝贵的实例字段。
我知道我可以简单地设置这个。allEventsSelectedClickedHandler中的构造函数,但我试图将方法创建与变量分开。
问题在于调用selectablesArrayGetter();
,它决定了回调的this
值。
您将需要"传递"this
值,该方法(即您正在返回的闭包)被调用,使用call
:
var array = selectablesArrayGetter.call(this);
我建议这样定义你的PromoViewModel.prototype.allEventsSelectedClickedHandler
方法:
PromoViewModel.prototype.allEventsSelectedClickedHandler = function() {
var _array = this.registrations;
var desiredState = _array.every(function(selectable) { return selectable.selected; }) ? false : true;
_array.forEach(function(selectable) {
selectable.selected = desiredState;
});
};
您作为回调传递的函数使用this
,但没有PromoViewModel
上下文。您可以通过将this
绑定到一个变量来确保该方法具有适当的上下文。
function PromoViewModel()
{
var me = this;
this.registrations = [...];
this.allEventsSelectedClickedHandler = createAllAreSelectedClickedHandler(function() {
return me.registrations;
});
}
Working fiddle: http://jsfiddle.net/michaschwab/coegnL5j/9/也有Bergi的答案在那里(注释掉),以表明它工作得一样好。
我是这么做的
在原型定义中,我没有将其直接关联到createAllAreSelectedClickedHandler
函数,而是定义了一个返回createAllAreSelectedClickedHandler
函数的函数。通过这样做,我可以定义一个变量(在这个例子中是protoScope),它在定义时映射这个上下文。这样做时,如果在createAllAreSelectedClickedHandler
函数中设置一个断点,您将看到selectablesArrayGetter
值是正确的(实际的注册数组)。
PromoViewModel.prototype.allEventsSelectedClickedHandler = function (){
var protoScope = this;
return createAllAreSelectedClickedHandler(function() {
return protoScope.registrations;
});
}
- 创建对象函数原型和代码是错误的
- 使用sinon.js创建一个“;“间谍对象”;使用基于真实构造函数/原型的间谍方法
- 使用构造函数 - 原型从文本框输出值
- 为什么函数对象的实例没有继承函数原型属性
- 获取函数原型的源代码
- 挂钩文档.使用函数原型创建元素
- 理解函数原型和__proto__
- 在Javascript的函数原型中创建函数
- Emberjs :哈希中的函数原型
- Javascript函数在父函数原型中带有原型
- 构造函数原型-继承混淆
- 本地作用域函数原型覆盖
- 使用函数原型的 JavaScript 继承问题
- 为什么我的代码认为 canvas 函数在 JavaScript 中的构造函数原型中是未定义的
- 所有内容也都链接到函数原型
- Javascript MDN 函数原型绑定 polyfill 在数组中是可枚举的
- Javascript将对象传递给函数原型
- 我应该使用构造函数/原型吗?
- 为什么函数原型不能修改 .
- 删除函数原型对象