плохая практика - модифицировать объект, переданный в качестве аргумента внутри метода?

1

это неправильная практика, модифицирующая объект, переданный в качестве аргумента внутри метода?

в чем разница между doSomething1 и doSomething2? оба делают то же самое, но по-другому. которые подходят и почему?

class Foo {
  constructor () {
    this.bar = { aaa: 123, bbb: 456 }
    this.doSomething1(this.bar)
    this.doSomething2()
  }

  doSomething1(arg) { arg.aaa = 10 },
  doSomething2() { 
    this.bar.bbb = 0
  }

}

сам код не практичен, а всего лишь пример кода.

  • 1
    Не совсем правильный сайт, чтобы опубликовать это, но ответ, зависит.
  • 0
    я опубликовал это в неправильном SO сообществе? Я использую мобильное приложение SO и не уверен, где мой вопрос размещен ...
Показать ещё 4 комментария
Теги:

3 ответа

1

Это разница между функцией и методом. Метод, который является функцией, определенной на объекте, знает все свойства объекта и разрешается модифицировать их (также известный как мутация или изменение состояния). doSomething2 - метод класса Foo. Следовательно, он должен иметь право или привилегию изменять какие-либо свойства экземпляра Foo.

doSomething1 с другой стороны, является функцией, маскирующейся как метод. Он не имеет права изменять аргумент, который он получает, и поэтому не должен. Если это действительно так, то вместо этого создайте новую копию с обновленным свойством.

  • 0
    создайте копию, измените ее и верните, верно?
  • 0
    Да. Это то, что я имел в виду.
0

Современный JavaScript в настоящее время занимает много заметок из мира функционального программирования. В функциональном программировании вы никогда ничего не модифицируете. Вопрос, который вы задаете, очень субъективен, и у многих людей будут разные мнения, но, по моему мнению, это не даст вам технического теста. Если бы я увидел, что вы делаете это в техническом интервью, это было бы мгновением, когда я подумал, и вы определенно не получите позицию, основанную исключительно на том, чтобы увидеть, как вы изменяете параметр функции, независимо от того, насколько хороша остальная часть интервью.

Верните новый экземпляр объекта.

return { ...arg, prop: 'New value' };
  • 0
    Я согласен. Я никогда не изменяю объект, переданный в качестве аргумента. но почему это плохая практика?
  • 0
    Потому что вы никогда не знаете, где еще этот объект используется. Если вы создаете новый экземпляр объекта для кода, для которого вы пишете функцию, вы можете быть на 100% уверены, что вы не затронули другую часть приложения, которую вы не ожидали. Я предлагаю прочитать о функциональном программировании и неизменности данных.
Показать ещё 5 комментариев
0

Разница в том, что doSomething1 можно использовать для изменения любого объекта, в то время как doSomething2() специально предназначен для изменения только свойства bar объекта объекта Foo который он вызвал.

Таким образом doSomething1() является более общей функцией. Поскольку это не ссылается на this, на самом деле даже не нужно быть в классе, за исключением того, что класс ограничивает то, как вы можете его назвать.

Кроме того, для вызова методов класса вам нужно вызвать его на объект, this.methodname(...).

var abc = {};

class Foo {
  constructor () {
    this.bar = { aaa: 123, bbb: 456 }
    this.doSomething1(this.bar)
    this.doSomething2()
    this.doSomething1(abc)
  }

  doSomething1(arg) { arg.aaa = 10 },
  doSomething2() { 
    this.bar.bbb = 0
  }
}
  • 0
    Я думаю, что doSomething1 должен вернуть новый объект.
  • 0
    Почему вы так думаете?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню