如何将对象传播到 JavaScript 中的 类 属性中
How to spread an object into a classes properties in JavaScript
基本上这就是我想要完成的。
class Person {
constructor (obj) {
this.first = ''
this.last = ''
this.age = ''
if (obj) {
Object.assign(this, ...obj)
}
}
}
const a = new Person()
console.log('Not spreading: ', a)
const b = new Person({ first: 'Alex', last: 'Cory', age: 27 })
console.log('Spreading: ', b)
有没有办法像这样传播一个对象来填充class?
如果您使用的是 Object.assign
,则不会使用展开符号;只需删除 ...
:
class Person {
constructor (obj) {
this.first = ''
this.last = ''
this.age = ''
if (obj) {
Object.assign(this, obj) // <============ No ...
}
}
}
const a = new Person()
console.log('Not spreading: ', a)
const b = new Person({ first: 'Alex', last: 'Cory', age: 27 })
console.log('Spreading: ', b)
有一个 proposal(目前处于第 3 阶段,因此很可能在 ES2018 中,并得到转译器的广泛支持)在对象初始化器中传播对象 属性,但这不会适用于对象已存在的情况。
这是您要找的吗?
class Person {
constructor (obj) {
this.firstName = ''
this.lastName = ''
this.age = ''
if (obj) {
Object.assign(this, obj)
}
}
}
const a = new Person()
console.log('Not spreading: ', a)
const b = new Person({ firstName: 'Alex', lastName: 'Cory', age: 27 })
console.log('Spreading: ', b)
您可以使用解构并只获取您需要的属性。
class Person {
constructor ({ first = '', last = '', age = '' } = {}) {
Object.assign(this, { first, last, age });
}
}
const a = new Person()
console.log('Not spreading: ', a)
const b = new Person({ first: 'Alex', last: 'Cory', age: 27, foo: 42 })
console.log('Spreading: ', b)
我个人更喜欢使用单独的方法,因为在 JS 中不可能有多个构造函数。在下面的示例中,我使用 static fromObject()
方法创建新对象,该方法 returns 一个新对象。因此,您可以保留常规构造函数并使用扩展语法创建新对象。
注意:我这里使用的是打字稿。
export class Point {
readonly x: number
readonly y: number
constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
static fromObject({x, y}: {x: number, y: number}) {
return new Point(x, y)
}
}
基本上这就是我想要完成的。
class Person {
constructor (obj) {
this.first = ''
this.last = ''
this.age = ''
if (obj) {
Object.assign(this, ...obj)
}
}
}
const a = new Person()
console.log('Not spreading: ', a)
const b = new Person({ first: 'Alex', last: 'Cory', age: 27 })
console.log('Spreading: ', b)
有没有办法像这样传播一个对象来填充class?
如果您使用的是 Object.assign
,则不会使用展开符号;只需删除 ...
:
class Person {
constructor (obj) {
this.first = ''
this.last = ''
this.age = ''
if (obj) {
Object.assign(this, obj) // <============ No ...
}
}
}
const a = new Person()
console.log('Not spreading: ', a)
const b = new Person({ first: 'Alex', last: 'Cory', age: 27 })
console.log('Spreading: ', b)
有一个 proposal(目前处于第 3 阶段,因此很可能在 ES2018 中,并得到转译器的广泛支持)在对象初始化器中传播对象 属性,但这不会适用于对象已存在的情况。
这是您要找的吗?
class Person {
constructor (obj) {
this.firstName = ''
this.lastName = ''
this.age = ''
if (obj) {
Object.assign(this, obj)
}
}
}
const a = new Person()
console.log('Not spreading: ', a)
const b = new Person({ firstName: 'Alex', lastName: 'Cory', age: 27 })
console.log('Spreading: ', b)
您可以使用解构并只获取您需要的属性。
class Person {
constructor ({ first = '', last = '', age = '' } = {}) {
Object.assign(this, { first, last, age });
}
}
const a = new Person()
console.log('Not spreading: ', a)
const b = new Person({ first: 'Alex', last: 'Cory', age: 27, foo: 42 })
console.log('Spreading: ', b)
我个人更喜欢使用单独的方法,因为在 JS 中不可能有多个构造函数。在下面的示例中,我使用 static fromObject()
方法创建新对象,该方法 returns 一个新对象。因此,您可以保留常规构造函数并使用扩展语法创建新对象。
注意:我这里使用的是打字稿。
export class Point {
readonly x: number
readonly y: number
constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
static fromObject({x, y}: {x: number, y: number}) {
return new Point(x, y)
}
}