如何从第二个对象更改第一个对象的值?

时间:2020-06-05 20:14:41

标签: javascript

我可以解释为什么不能从另一个对象分配值吗? 以及如何从第二个对象更改第一个对象的值?

class Test {
  obj1 = {
    obj1Value: [1, 2, 3],
  };

  obj2 = {
    changeValue() {
      this.obj1.obj1Value = [2, 2, 2];
    },
  };
}

let test = new Test();

console.log(test.obj1.value); // [1, 2, 3]
test.obj2.changeValue();
console.log(test.obj1.value); // TypeError: Cannot set property 'obj1Value' of undefined ???

2 个答案:

答案 0 :(得分:3)

当您执行test.obj2.changeValue()时,由于this的方式,在changeValue内使用obj2是指Test而不是this类绑定有效,请尝试使用箭头功能,以便继承this以引用Test

class Test {
  obj1 = {
    obj1Value: [1, 2, 3],
  };

  obj2 = {
    changeValue: () => {
      this.obj1.obj1Value = [2, 2, 2];
    },
  };
}

let test = new Test();

console.log(test.obj1.obj1Value);
test.obj2.changeValue();
console.log(test.obj1.obj1Value);

当函数是对象的属性,而您通过对象调用它时,即{{this绑定中,不需详细介绍obj.func()绑定(更详细的信息可以在here中找到)。 1}},this将引用通过其调用的对象,即obj。如果改为使用f = obj.func; f(),则this的行为会有所不同。这与如何调用函数有关。使用箭头函数(也称为匿名函数)取而代之的是从其父上下文继承this关键字,这就是为什么您可以在test.obj2.changeValue()引用this的情况下执行obj2

答案 1 :(得分:1)

使用箭头功能,您可以达到正确的范围。像这样:

  obj1 = {
    obj1Value: [1, 2, 3],
  };

  obj2 = {
    changeValue: () => {
      this.obj1.obj1Value = [2, 2, 2];
    },
  };