StepanTur
@StepanTur
Web frontend/backends Калининград

Как в js заменить множество this.varible=variable в конструкторе объектов?

Например если есть множество классов таких как

class User {
  constructor(id, name, comments, avatar) {
    this.id = id;
    //this.name.....
  }
}

Как заменить эту длинную конструкцию из this.x=x;
Тем более если имеется до 20 классов
  • Вопрос задан
  • 162 просмотра
Пригласить эксперта
Ответы на вопрос 4
@casoer
Я знаю 2 вариант
1. Оооооооооочень костыльно, но можешь хранить аргументы в каком-то объекте и серез call/aply вызывать методы(не рекомендую делать, это очень сильный говнокод)
2. Используй Typescript
Другие извесные мне методы занимают ещё больше времени для написания
Ответ написан
bootd
@bootd
Гугли и ты откроешь врата знаний!
class User{
	constructor(data) {
		Object.assign(this, data)
	}
}

new User({ 
id: 1, 
name: 'Вася', 
comments: [], 
avatar: null 
})


Но делать так не нужно, ваш класс сразу же становится не читаемым и сложно понимаемым. Т.к. явно не видно тех свойств, которые в нём могут быть и которые там явно должны быть. В итоге придётся по всей кодовой базе искать возможные передаваемые параметры.

А так же, в конструктор запишутся все свойства, которые будут переданы, даже те, которые вы не собираетесь использовать.

P.S. Да хоть у вас 100500 классов, зато зайдя в каждый сразу становится понятно, с какими входными данными он работает. Через пару тройку недель вы сами забудете, какие параметры нужно в каждый из классов передавать, ну и другие разрабы вас по головке за такое сокращение не погладят
Ответ написан
Kozack
@Kozack Куратор тега JavaScript
Вот несколько вариантов:

class User {
  constructor( id, name, comments, avatar ) {
    Object.assign(this, { id, name, comments, avatar });
  }
}
const user = new User(42, 'John', 1, 'cat.jpg');


Чуть более читаемо
class User {
  constructor({ id, name, comments, avatar } ) {
    Object.assign(this, { id, name, comments, avatar });
  }
}
const user = new User({ id: 42, name: 'John', comments: 1, avatar: 'cat.jpg'});


Но изначальный вариант, только без огромного числа аргументов, на мой взгляд лучше.
class User {
  constructor({id, name, comments}) {
    this.id = id
    this.name = name
    this.comments = comments
  }
}

  1. Он более наглядный для разработчика.
  2. Он проще для рефакторинга и отладки.
  3. Он намного понятнее для вашей IDE. Не каждая IDE умеет корректно обрабатывать Object.assign чтобы выдавать вам контекстные подсказки.
Ответ написан
MRoose
@MRoose
Застал эпоху исчезновения 3.5 мм mini-jack
https://learn.javascript.ru/rest-parameters-spread...
class User {
  constructor(...args) {
    args.forEach(elem => this[elem] = elem)
  }

  get(blabla) {
    return this[blabla];
  }
}

let a;
let b;
let c;

let obj; {
  a = 0;
  b = "+";
  c = "gvfbd";
  obj = new User(a, b, c);
}

console.log(obj[a])
console.log(obj.get(a))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
17 февр. 2020, в 19:27
200 руб./в час
17 февр. 2020, в 19:08
40000 руб./за проект
17 февр. 2020, в 17:35
15000 руб./за проект