это неправильная практика, модифицирующая объект, переданный в качестве аргумента внутри метода?
в чем разница между 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
}
}
сам код не практичен, а всего лишь пример кода.
Это разница между функцией и методом. Метод, который является функцией, определенной на объекте, знает все свойства объекта и разрешается модифицировать их (также известный как мутация или изменение состояния). doSomething2
- метод класса Foo
. Следовательно, он должен иметь право или привилегию изменять какие-либо свойства экземпляра Foo
.
doSomething1
с другой стороны, является функцией, маскирующейся как метод. Он не имеет права изменять аргумент, который он получает, и поэтому не должен. Если это действительно так, то вместо этого создайте новую копию с обновленным свойством.
Современный JavaScript в настоящее время занимает много заметок из мира функционального программирования. В функциональном программировании вы никогда ничего не модифицируете. Вопрос, который вы задаете, очень субъективен, и у многих людей будут разные мнения, но, по моему мнению, это не даст вам технического теста. Если бы я увидел, что вы делаете это в техническом интервью, это было бы мгновением, когда я подумал, и вы определенно не получите позицию, основанную исключительно на том, чтобы увидеть, как вы изменяете параметр функции, независимо от того, насколько хороша остальная часть интервью.
Верните новый экземпляр объекта.
return { ...arg, prop: 'New value' };
Разница в том, что 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
}
}