Как расширить объект с классом в ES6? - PullRequest
6 голосов
/ 02 апреля 2019

Я пытаюсь очистить определение класса ES6, теперь у меня есть такой код:

class SomeClass {
  constructor({a, b, c, d, e}) {
    this.a = a;
    this.b = b;
    this.c = c;
    this.d = d;
    this.e = e;
    // some codes here
  }
  // some methods here..
}

Этот код расширяет все, что передается конструктору.

Я использую его в этомпуть:

var obj = new SomeClass({a:1, b:2, c:3, d:4, e:5});

Когда я хочу изменить параметр, передаваемый конструктору, например:

var obj = new SomeClass({a:1, b:2, c:3, d:4, e:5, f:6});

Я хочу, чтобы obj.f было 6.

Я хочу, чтобы конструктор можно было использовать повторно, если я передаю ему другие параметры.Если параметры, передаваемые конструктору, изменяются, возвращаемое значение изменяется.

Я пробовал это:

class SomeClass extends Object {
  constructor(params) {
    super(params);
    // some codes here
  }
  // some methods here..
}

, но это не работает.

Так почему это не работаетРабота?Если я расширяю класс Object, почему super({a:1}) не возвращает {a:1}?

$ node
> new Object({a:1})
{ a: 1 }
> class MyClass extends Object {
... constructor(params) { super(params); }
... }
undefined
> new MyClass({a:1})
MyClass {}

А как достичь своей цели?

Ответы [ 4 ]

4 голосов
/ 02 апреля 2019

Я не совсем уверен, что понимаю ваши потребности, но кажется, что-то простое должно соответствовать вашим потребностям:

class SomeClass {
  constructor(obj) {
    Object.assign(this, obj);
    // some codes here
  }
  // some methods here..
}

Таким образом

var obj = new SomeClass({a:1, b:2, c:3, d:4, e:5, f:6});

работает просто отлично.

2 голосов
/ 02 апреля 2019

Думаю, вы, вероятно, хотите что-то вроде:

class SomeClass {
  constructor(o) {
    Object.assign(this, o);   
  }  
}

console.log(new SomeClass({a:1}))
console.log(new SomeClass({a:1, b:2, c:3, d:4, e:5}))
1 голос
/ 02 апреля 2019

Как отмечали другие, использование Object.assign решит ваш случай, а не будет расширяться от Object.

class SomeClass {
  constructor(obj) {
    Object.assign(this, obj);   
  }  
}


console.log(new SomeClass({a:1, b:2, c:3, d:4, e:5, f:6}))

Что касается ответа, когда вы вызываете super(params) в классе, расширенном объектом Object, вы вызываете конструктор Object, который не имеет параметров.

Когда вы используете new Object({a:1}), вы вызываете метод, а не конструктор.

Сначала меня это тоже сбивало с толку, и мне пришлось искать его.

Ссылка и дополнительная информация здесь:

https://www.ecma -international.org / ecma-262 / 6.0 / # sec-properties-of-of-объектно-конструктор

0 голосов
/ 02 апреля 2019

Мы можем использовать оператор распространения, чтобы получить остальные аргументы.

Пример:

class SomeClass {
  constructor({a, b, c, d, e, ...rest}) { 
    console.log(rest);
  }
}

здесь переменная rest будет иметь все остальные значения. N 1010 *

и вы можете с

var obj = new SomeClass({a:1, b:2, c:3, d:4, e:5, f:6, g: 7});

Я надеюсь, что это поможет вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...