Как реализовать именованный конструктор в ES6 - PullRequest
1 голос
/ 25 апреля 2019

Я пытаюсь реализовать использование именованного конструктора в ES6.Причина этого в том, что я подумал, что было бы приятнее избегать вызова конструктора с ключевым словом new и вместо этого использовать простой метод класса для использования других методов.Я думал об использовании статической функции для этого как Proxy для конструктора.

Я попробовал следующее:

class Person {
  constructor(...props) {
    let {name, age} = props;
    this.name = name;
    this.age = age;
  }
  static create(...props) {
    return new Person(props);
  }
  
  display() {
    console.log(this)
  }
}

Person.create({name: 'John', age: 28}).display(); //Simple object input

Но это не сработает, поскольку простой ввод объекта дает:

Person {name: undefined, age: undefined}

Любая помощь приветствуется.

Обновление : Спасибо, ответ @appleapple очень помог.Я не заметил факт, что я передавал единственный аргумент.Для тех, кто интересуется, как это можно сделать для метода конструктора n-Ary (конечно, использование объекта очень удобно, но все же), вот пример:

class Person {
  constructor([name, age ]) {
    this.name = name;
    this.age = age;
  }
  static create(...props) {
    return new Person(props); //return new this(props); also works
  }
  
  display() {
    console.log(this)
  }
}

Person.create('John', 28).display();

Ответы [ 2 ]

3 голосов
/ 25 апреля 2019

не так уж сложно, объект является единственным аргументом, поэтому просто передайте его.

class Person {
  constructor(props) { // <-------
    let {name, age} = props;
    this.name = name;
    this.age = age;
  }
  static create(props) { // <-------
    return new Person(props); 
  }

  display() {
    console.log(this)
  }
}

Person.create({name: 'John', age: 28}).display();
0 голосов
/ 27 апреля 2019

ответьте на ваше обновление, на самом деле вы можете отправить аргументы (и я думаю, что конструктор выглядит лучше в этом случае)

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
  static create(...props) {
    return new Person(...props); // <----------
  }
  
  display() {
    console.log(this)
  }
}

Person.create('John', 28).display();

или вы также можете использовать параметр rest в конструкторе (хотя мне это не нравится)

class Person {
  constructor(...props) {  // <----------
    let [name, age]=props
    this.name = name;
    this.age = age;
  }
  static create(...props) {
    return new Person(...props); // <----------
  }
  
  display() {
    console.log(this)
  }
}

Person.create('John', 28).display();
...