Javascript构造函数创建与以前创建的对象具有相同值的新对象



这是我的(简化的(构造函数:

class User {
constructor() {
Object.assign(this, setup); 
}
}
const setup = {
name: ''
}
export { User }

当我创建一个新对象时

import {
User
} from './User.js';
let user1 = new User();

user1是我所期望的。

如果我声明user1.name = 'John',然后创建另一个用户let user2 = new User(),那么user2.name将是John,而不是空字符串。

有人能解释一下原因吗?

setup似乎正在被更改和引用,而不是创建的新用户对象。

似乎正在更改和引用setup,而不是创建的新用户对象。

是。在将对象分配给类的实例之前,您需要复制该对象

class User {
constructor() {
Object.assign(this, {...setup}); 
}
}

对于其他遇到类似问题的人,我终于找到了答案。在Javascript中,它可以归结为浅层复制与深层复制。spread(...)Object.assign()都执行浅拷贝,而JSON方法执行深度拷贝。

如果您的设置是嵌套对象,如

const setup = {
name: '',
address: {
city: ''
}
}

当使用{...}Object.assign()时,setup内部的address对象将保持为参考值,而不是基元值。

如果你想复制整个对象,你需要将其复制为JSON.parse(JSON.stringify(setup)),所以我的构造函数应该是

class User {
constructor() {
Object.assign(this, JSON.parse(JSON.stringify(setup))); 
}
}

因为这执行深度(嵌套(复制。

最新更新