gpt4 book ai didi

带有类实例的 JavaScript 扩展运算符

转载 作者:行者123 更新时间:2023-12-01 15:34:28 25 4
gpt4 key购买 nike

如何使用扩展运算符修改类实例,同时保持其构造函数相同?
举个例子,这个问题可能会更清楚。

class User {
constructor({ name = "", age = 0 }) {
this.name = name
this.age = age
}

getName() {
return this.name
}

getAge() {
return this.age
}
}
创建一个常规实例可以正常工作:
const u1 = new User({ name: 'John Doe', age: 33 })
console.log(u1.getAge()) // 33
不起作用的是在实例中使用扩展运算符:
const u2 = { ...u1, age: 34 }
console.log(u2.getAge()) //
我读到传播运算符只复制自己的可枚举属性,所以我也尝试了这个:
const u3 = { ...u1, ...User.prototype, age: 34 }
console.log(u3.getAge())
这效果更好(它允许我调用 User 中的方法),但在使用 instanceof 时仍然中断或 Object.isPrototypeOf() :
console.log(u1 instanceof User) // true
console.log(u2 instanceof User) // false
console.log(u3 instanceof User) // false

console.log(User.isPrototypeOf(u1)) // true
console.log(User.isPrototypeOf(u2)) // false
console.log(User.isPrototypeOf(u3)) // false
我也尝试了这些,但它们也不起作用:
const u4 = Object.assign({ age: 34 }, u1)
const u5 = Object.assign({ age: 34 }, u1, User.prototype)
那么,TL:DR,是否可以创建一个类实例的副本来更改父级的某些属性,但保留对其构造函数的引用?
希望我说清楚了。在此先感谢您的帮助!

最佳答案

{ }对象字面量表示法,您总是创建一个普通对象,而不是自定义类的实例。您应该使用 new运算符获取新实例(或 Object.create ):

class User {
constructor({ name = "", age = 0 }) {
this.name = name
this.age = age
}

getName() {
return this.name
}

getAge() {
return this.age
}
}

const u1 = new User({ name: 'John Doe', age: 33 })
console.log(u1.getName(), u1.getAge()) // John Doe, 33

const u2 = new User({ ...u1, age: 34 });
console.log(u2.getName(), u2.getAge()) // John Doe, 34

关于带有类实例的 JavaScript 扩展运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62488227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com