我通常在代碼中使用與設計模式custom objects非常相似的內容。爲什麼在JavaScript構造函數中使用副作用不好的做法?
但是JSLint的皺眉在結構是這樣的:
function MyClass() { this.init(); }
new MyClass(data);
因爲對象被創建後立即丟棄 - 它沒有被用於任何東西。 我們可以欺騙JSLint通過將它分配給一個變量來忽略這一點,但它並沒有改變JSLint(我猜很多JavaScript愛好者)不鼓勵這種模式。
那麼,爲什麼在JavaScript構造函數中使用副作用被認爲是不好的做法?
對於它的價值,我認爲這是一個很好的實踐因爲:
- 你有一個設置功能,因此它應該是更容易維護,如果如您正在管理MyClass實例的列表以供稍後訪問。 (把一個對象放到一個數組上是一個副作用,在構造函數返回時是「很好的做法」=難以維護)。
- 它有自己的原型,因此是「類所有權」: Firebug將此報告爲MyClass的一個實例,而不僅僅是Object。 (這一點,在我看來,使其優於其他的設計模式。)
JSLint不鼓勵'新的MyClass',因爲在實例化它之後你並沒有使用它。因此,它只被用於其副作用。相反,這個例子可以被重寫爲使用依賴注入作爲'initialize(new MyClass());'(儘管這個例子非常簡單以至於很愚蠢)。 – zzzzBov
你真的從來沒有將任何新創建的MyClass實例賦值給任何東西(換句話說,這是一種使init()成爲一種靜態方法的複雜方法)嗎?這種模式的「正常」使用不會觸發JSLint警告。 –
@FrédéricHamidi從來都不是,但有時會產生副作用,即完成這項工作本身,即沒有什麼需要去做。人員構造函數可能會實例化一個人員對象,但是您現在可能不一定需要對該人員進行操作。在你需要的情況下,副作用將自己註冊到一個數組中以供以後訪問。 – user1994380