这是我的(简化的(构造函数:
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)));
}
}
因为这执行深度(嵌套(复制。