У меня есть этот код, который довольно длинный, но в конце концов попадает в него ...

class WorksButLongWinded {
  constructor (callback, params = {}) {
    // defaults ...
    this.foo = "string";
    this.bar = 200;

    this.callback = callback;

    // params ...
    if( typeof params.foo != "undefined" ) { this.foo = params.foo }
    if( typeof params.bar != "undefined" ) { this.bar = params.bar }
  }
}

Я подумал, что могу попробовать использовать деструктуризацию, чтобы ускорить процесс, например:

class DoesNotWork {
  constructor (callback, params = {}) {
    {
      this.foo = "string", 
      this.bar = 200
    } = params;

    this.callback = callback;

  }
}

... кроме этого не работает. Он даже не проходит проверку синтаксиса.

Каков чистый и простой способ написать конструктор класса, который принимает необязательный объект params с различными необязательными параметрами, которые переопределяют некоторые значения по умолчанию?

0
Erics 24 Сен 2018 в 08:26

2 ответа

Лучший ответ

Вы имеете в виду что-то вроде этого?

class WorksButLongWinded {
  constructor(callback, params) {
    let defaults = {
      foo: "string",
      bar: 200
    };

    this.callback = callback;
    Object.assign(this, defaults, params);
  }
}

let a = new WorksButLongWinded(() => {});
console.log(a.foo);  // "string"
console.log(a.bar);  // "200"

let b = new WorksButLongWinded(() => {}, {foo: "bar"});
console.log(b.foo);  // "bar"
console.log(b.bar);  // "200"

Object.assign делает именно то, что вы хотите.

2
Derek 朕會功夫 24 Сен 2018 в 05:36

Я считаю, что способ деструктуризации неверен. Попробуйте приведенный ниже код, в котором мы деструктурируем параметры, а затем присваиваем ему значения.

class WorksButLongWinded {
  constructor (callback, params = {}) {
    const {foo = "string", bar = 200} = params;
    this.foo = foo;
    this.bar = bar;
    this.callback = callback;
  }
}
1
Shubham Gupta 24 Сен 2018 в 05:31