如何基于另一个对象分配对象属性

时间:2019-10-10 21:48:30

标签: javascript

我试图基于参数对象的属性来覆盖某些对象属性。

这段代码几乎可以完成我想要做的事情:

// 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仍保留为上一次循环迭代中的值。这意味着onOpenonClose都指向同一件事,即function() {callbacks[callback](myObject.text);}。由于他们俩都使用callback的旧循环迭代值,因此他们最终都指向bang,而不是一个指向boing,另一个指向bang

我真的很喜欢这种带有函数名称的键对象的想法,但是实际上有一种方法可以进行这种类型的分配吗?基本上,我想使用其实际名称(而不是变量本身)在循环的中间“冻结” callback的值。

1 个答案:

答案 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);
});