12

基本上这就是我想要完成的。

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)

有没有办法传播这样的对象来填充一个类?

4

4 回答 4

13

如果您使用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)

有一个提案(目前处于第 3 阶段,因此很可能在 ES2018 中,并且受到编译器的广泛支持)在对象初始化器中传播对象属性,但这不适用于对象已经存在的情况。

于 2017-09-18T06:58:37.083 回答
7

您可以使用解构并仅获取您需要的属性。

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)

于 2017-09-18T07:11:26.200 回答
2

这是你要找的吗?

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)

于 2017-09-18T06:58:37.283 回答
0

我个人更喜欢使用单独的方法,因为 JS 中不可能有多个构造函数。在以下示例中,我使用static fromObject()返回新对象的方法创建新对象。因此,您也可以保留普通的构造函数并使用扩展语法创建新对象。

注意:我在这里使用打字稿。

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)
    }
}
于 2021-10-21T10:31:14.947 回答