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}]
创建了一个新数组,因此将新数组分配给点
不会更改点
变量(思考指针)的数据指向,但会将指针本身更改为新的内存位置。因此,它确实是通过引用进行赋值!刚刚理解了这一点:我通过分配新的引用来丢弃该引用