簡體   English   中英

修改作為方法內部參數傳遞的對象是一種不好的做法嗎?

[英]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 或更改狀態)。 doSomething2Foo類的一個方法。 因此,它應該有權或特權改變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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM