了解為什麼不應該修改 JavaScript 物件的原型,以及應該做什麼

作為程式設計師,我們必須首先學會的技能之一就是如何尋找解決方案。

Google 是你的朋友。而大多時候,一個來自 2009 年的 StackOverflow 解答能夠完美解決你在 2019+ 的問題。

在該網站或個人部落格上,有時候我會看到一些修改內建物件原型的程式碼。

就像這個例子,它擴充了 Array 物件的原型,增加了一個 insert 方法:

Array.prototype.insert = function(index, item) {
  this.splice(index, 0, item)
}

這樣一來,你可以對任何陣列調用 insert() 方法:

['red', 'blue'].insert(0, 'yellow')

這樣很方便。你不需要定義這樣的函式,也不需要擔心作用域的問題,只需將它附加到 Array 物件上,這樣每個陣列都可以使用它。

但僅僅因為你這麼做,並不意味著你應該這樣做。

這種方法有什麼問題呢?

可能的衝突

假設你使用的一個函式庫實現了這樣的功能。而你引入的另一個函式庫也做了同樣的事情。可能這些方法稍有不同,看起來好像一切都順利,直到事情不好時。

你會有一個大問題,因為你無法修改這些函式庫,但你仍然希望使用它們。

未來護航你的程式碼

假設下一個 JavaScript 版本實作了 Array.insert 方法,但參數簽名不同。現在會發生什麼?你需要回頭重寫所有的程式碼。也許是為了一個你不再工作的客戶。

或者你可能在一個被其他人在他們自己的專案中使用的函式庫中這樣做,那就更糟糕了。

這種做法只會造成技術債務,並且很容易引發問題。

你應該做什麼?

在程式庫檔案中創建一個函式,需要時導入它。不要修改你無法控制的對象。