2016-05-16 67 views
0

在JavaScript內置對象中定義了許多函數。例如String具有slice()split()Array具有join()並且它們可以通過簡單地使用我們是否應該始終保留JavaScript內置對象方法的副本?

Array.prototype.join = 'test'被覆蓋(雖然它是一種不好的做法),則所有的陣列將失去join()方法

然而,作爲開源項目的開發者,我們應該如何看待原型的這種潛在變化?這將成爲一個問題,因爲我們很可能會或多或少地使用這些功能來實現某些功能。

在jQuery中,它會不斷的一些方法,一個副本:

但只有一些方法保持安全,如果通過的jQuery的源代碼閱讀,你會發現一些String方法直接在String對象上調用。

當然,我們可以隨時保留內置JavaScript對象的所有方法的副本,但它很雜亂。事實上,它也成爲執行時機的問題。如果程序在原型更改之前執行,那就沒問題。但如果反之亦然,它將會失敗。所以我更感興趣的是,當他們決定保留一些方法的副本時,他們知道什麼時候jQuery或其他庫,他們的決定背後的哲學是什麼?

謝謝。

+0

可能的重複[爲什麼擴展本機對象是一個不好的做法?](http://stackoverflow.com/questions/14034180/why-is-extending-native-objects-a-bad-practice) – CBroe

+0

爲什麼你需要打擾原型。還有其他幾種方法。在這樣設置之前進行檢查不是更好嗎? – Jai

+0

如果我想和我正在合作的程序員開個玩笑,我只會覆蓋原始原型。 – Nonemoticoner

回答

2

作爲開源項目的開發者,最安全和最好的做法是假裝內置原型被凍結。擴展或修改它們的做法所造成的問題遠遠多於解決方案。

如果您需要自定義join函數,只需創建它,以便它將字符串作爲第一個參數。

function join(string, separator) { 
    // ... 
} 

這樣可以保持原型清潔,並避免您擔心引用覆蓋的方法。

你在jQuery示例中看到的只是別名。這些方法被分配給變量以使它們更易於使用。

無法圍繞此進行防禦性編碼,因爲在jQuery加載時,另一個腳本可能已經修改了內建原型,原始引用將會丟失。

+0

這是有道理的。只是添加一些額外的信息,它可能會混淆起初(至少讓我困惑),調用'a.concat(b,c)'比'concat.call(a,b,c)'容易'那麼爲什麼要麻煩?但我已經研究了jQuery中的源代碼,當他們必須調用'concat.apply(a,arrayOfValues)'時,他們通常使用'concat'和其他方法。如果沒有別名,它將成爲'Arrray.prototype.concat.apply(a,arrrayOfValues)' –

相關問題