Javascript解构:通过引用复制类变量以允许赋值和修改值 class-MyClass{ 构造函数(){ 此参数为.points=[]; //我需要在安装完组件后调用它 //所以要把设置分开 这个.setupMyClass(); } setupMyClass(){ 设{points}=这个; 点=[…点,{x:20,y:20}]; //丑陋的代码

Javascript解构:通过引用复制类变量以允许赋值和修改值 class-MyClass{ 构造函数(){ 此参数为.points=[]; //我需要在安装完组件后调用它 //所以要把设置分开 这个.setupMyClass(); } setupMyClass(){ 设{points}=这个; 点=[…点,{x:20,y:20}]; //丑陋的代码,javascript,destructuring,ecma,Javascript,Destructuring,Ecma,这是因为 class MyClass { constructor() { this.points = []; // I need to call this after the components are mounted // So keeping the setup separate this.setupMyClass(); } setupMyClass() { let {points} = this; points = [...p

这是因为

class MyClass {
  constructor() {
    this.points = [];
    // I need to call this after the components are mounted
    // So keeping the setup separate
    this.setupMyClass();
  }

  setupMyClass() {
    let {points} = this;
    points = [...points, {x: 20, y:20}];

    // ugly code This is because

[...points, {x: 20, y:20}];
创建了一个新数组

let {points} = this;
最初指向属于类实例的点数组,但

points = [...points, {x: 20, y:20}];
更改引用

您可以使用
.push
将引用维护为:

points.push({x: 20, y:20});
编辑以更详细地解释:

[…points,{x:20,y:20}]
创建一个新数组,因此将新数组指定给点不会更改
points
变量(think pointer)指向的数据,而是将指针本身更改为一个新的内存位置。

这是因为

class MyClass {
  constructor() {
    this.points = [];
    // I need to call this after the components are mounted
    // So keeping the setup separate
    this.setupMyClass();
  }

  setupMyClass() {
    let {points} = this;
    points = [...points, {x: 20, y:20}];

    // ugly code This is because

[...points, {x: 20, y:20}];
创建了一个新数组

let {points} = this;
最初指向属于类实例的点数组,但

points = [...points, {x: 20, y:20}];
更改引用

您可以使用
.push
将引用维护为:

points.push({x: 20, y:20});
编辑以更详细地解释:


[…points,{x:20,y:20}]
创建一个新数组,因此将新数组分配给points不会更改
points
变量(think pointer)指向的数据,而是将指针本身更改为一个新的内存位置。

使用
let{points}=this;
,则
points
变量包含一个值,该值是对数组的引用。 因此,当您在链接的答案中编辑该数组的属性时,您可以修改引用的数组

但是在您的例子中,您使用
点=[…点,{x:20,y:20}];
。在这里,您为
点指定了一个新值(对新创建的数组的引用),因此对旧数组的引用消失了


在这种情况下,您可以简单地使用
this.points=[…points,{x:20,y:20}];
将其分配给
this
,或者使用
this.points.push({x:20,y:20})
将对象直接推送到
this.points
(对于后者,您首先不需要使用解构赋值。)

当使用
让{points}=this;
时,
points
变量包含一个值,该值是对数组的引用。 因此,当您在链接的答案中编辑该数组的属性时,您可以修改引用的数组

但是在您的例子中,您使用
点=[…点,{x:20,y:20}];
。在这里,您为
点指定了一个新值(对新创建的数组的引用),因此对旧数组的引用消失了


在这种情况下,您可以简单地使用
this.points=[…points,{x:20,y:20}];
将其分配给
this
,或者使用
this.points.push({x:20,y:20})
将对象直接推送到
this.points
(对于后者,您首先不需要使用解构赋值。)

为什么不使用
this.points=points
?为什么不
this.points.push({x:20,y:20})
?@javrd现在我需要跟踪我更改了哪些变量,哪些没有更改。或者在最后将所有局部变量重新分配给类变量?@SaravanabalagiRamachandran不,没有。推送功能在这里更好,我误解了点x)为什么不使用
this.points=points
?为什么不
this.points.push({x:20,y:20})
?@javrd现在我需要跟踪我更改了哪些变量,哪些没有更改。或者在最后将所有局部变量重新分配给类变量?@SaravanabalagiRamachandran不,没有。这里的推送方式要好得多,我误解了x点)正如我已经解释的,
[…点,{x:20,y:20}]
创建了一个新数组,因此将新数组分配给
不会更改
变量(思考指针)的数据指向,但将指针本身更改为新的内存位置。因此,它确实是通过引用进行赋值!刚刚理解了这一点:我通过分配一个新的引用来丢弃该引用,正如我已经解释的,
[…points,{x:20,y:20}]
创建了一个新数组,因此将新数组分配给
不会更改
变量(思考指针)的数据指向,但会将指针本身更改为新的内存位置。因此,它确实是通过引用进行赋值!刚刚理解了这一点:我通过分配新的引用来丢弃该引用