如何将对象传播到 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)
    }
}