我有一个这样的课程:
class Person {
private _age: number;
get age(): number {
return this._age;
}
set age(value: number) {
this._age = value;
}
}
该类的一个实例:
let peter = new Person();
peter.age = 30;
我想通过简单地使用spread运算符来获得该类的另一个实例:
let marc = {
...peter,
age: 20
}
但是这不会导致Person
的实例,而是在没有Person
的getter和setter的对象中。
是否有可能以某种方式合并类实例,或者我是否需要再次使用new Person()
进行mark
?
答案 0 :(得分:2)
Spread语法应该生成普通对象,因此它不适用。如果需要新的类实例,则应使用new
创建它。如果必须将对象与其他属性合并,则可以使用Object.assign
:
let marc = Object.assign(
new Person()
peter,
{ age: 20 }
);
由于Object.assign
进程拥有可枚举属性,因此结果可能是不合需要的或意外的,具体取决于类内部;它将从_age
复制私人age
但不公开peter
。
在任何特殊情况下,类都应该实现像clone
这样的实用程序方法,它们能够识别类内部并正确地创建实例。
答案 1 :(得分:0)
在OOP术语中,您未在创建实例后定义属性,而是在class
在你的例子中,Marc和Peter都有一个年龄,所以你不需要合并任何东西。您可以使用构造函数为该实例传递特定值:
let marc = new Person("marc", 20)
let peter = new Person("peter", 30)
class Person {
constructor(private name:string, private age:number){
console.log("I am " + this.name + " my age is " + this.age)
}
}
如果有一个属性,除了Marc之外没有人,那么你可以让Marc扩展Person。
class Person {
}
class Marc extends Person {
car:string
}