我试图基于参数对象的属性来覆盖某些对象属性。
这段代码几乎可以完成我想要做的事情:
// This function makes an object, assigns the given
// callbacks to it, then processes it.
function myFunction(callbacks) {
// Create the object. It has 2 callbacks that I
// want to override.
var myObject = new Foo();
// In this example, assume Foo now looks like this:
// {
// resultText: "",
// onOpen: null,
// onClose: null
// }
// Now assign all the callbacks to myObject based
// on their name.
for(var callback in callbacks) {
myObject[callback] = function() {
callbacks[callback](myObject.resultText);
}
}
// Now we process the object, which should set the resultText
// and also end up calling the assigned callbacks when they
// are supposed to be called.
myObject.process();
}
// Here is where I call myFunction and specify the callbacks
myFunction({
onOpen: boing,
onClose: bang
});
// Assume boing and bang are functions that operate on resultText.
我希望得到的基本上是这样的:
var myObject = new Foo();
myObject.onOpen = () => boing(myObject.resultText);
myObject.onClose = () => bang(myObject.resultText);
myObject.process();
除了我想以一种很好的参数化方式指定它。
仅给出1个回调,即可正常工作。但是给定这两个变量,for循环中的变量callback
仍保留为上一次循环迭代中的值。这意味着onOpen
和onClose
都指向同一件事,即function() {callbacks[callback](myObject.text);}
。由于他们俩都使用callback
的旧循环迭代值,因此他们最终都指向bang
,而不是一个指向boing
,另一个指向bang
我真的很喜欢这种带有函数名称的键对象的想法,但是实际上有一种方法可以进行这种类型的分配吗?基本上,我想使用其实际名称(而不是变量本身)在循环的中间“冻结” callback
的值。
答案 0 :(得分:1)
问题在于关闭;最简单的修复方法是使用let
而不是var
for(let callback in callbacks) {
myObject[callback] = function() {
callbacks[callback](myObject.resultText);
}
}
另一种方法是使用箭头功能编写
Object.keys(callbacks).forEach(callback => {
myObject[callback] = () => callbacks[callback](myObject.resultText);
});