[英]is it a bad practice modifing an object passed as an argument inside a method?
修改作為方法內部參數傳遞的對象是一種不好的做法嗎?
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
}
}
代碼本身並不實用,只是一個示例代碼。
這就是函數和方法的區別。 方法是在對象上定義的函數,它知道對象的所有屬性並允許修改它們(也稱為 mutate 或更改狀態)。 doSomething2
是Foo
類的一個方法。 因此,它應該有權或特權改變Foo
實例的任何屬性。
另一方面, doSomething1
是一個偽裝成方法的函數。 它無權修改它收到的參數,因此不應該。 如果確實必須,則使用更新的屬性創建一個新副本。
不同之處在於doSomething1
可用於修改任何對象,而doSomething2()
專門設計為僅修改其調用的對象Foo
對象的bar
屬性。
所以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
}
}
如今,現代 JavaScript 正在從函數式編程世界中吸取很多經驗。 在函數式編程中,你永遠不會修改任何東西。 你問的問題是非常主觀的,很多人會有不同的意見,但我的觀點是,這會立即讓你無法通過技術測試。 如果我在技術面試中看到你這樣做,那將是我下定決心的那一刻,無論面試的其余部分有多好,你絕對不會僅僅因為看到你修改了一個函數參數就得到了這個職位。
返回一個對象的新實例。
return { ...arg, prop: 'New value' };
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.