2010-08-26 61 views
2

你會考慮通過原型來擴展原生元素嗎?我看到一些框架如Prototype這樣做,所以我開始懷疑我是否也敢這麼做。通過原型在JavaScript中擴展本地元素?

我很擔心像addClassName這樣的事情發生,並且使得它在未來發生碰撞,這種方式我不能解決任何其他方式,而不是重寫軟件並要求模塊作者執行相同的操作。

+0

https://stackoverflow.com/questions/14034180/why-is-extending-native-objects-a-bad-practice的潛在副本 – 2018-02-25 20:57:26

回答

2

我不會因爲恕我直言,它可能很快就會發生碰撞,並創建一個很難被發現的潛在錯誤。

我反正也延長一些基本的簡單的本地JavaScript對象,如String.trim,我反正小心總是測試,看它是否已經存在,通過一個簡單的測試,如果:

if(!String.prototype.trim) 
    String.prototype.trim = function() { return this.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); } 

你可以用addClassName做同樣的事情。 不同之處在於用String.trim這樣的簡單函數來做這件事,將來很可能會導致問題,因爲即使瀏覽器引擎有String.trim(實際上FF有它),那麼這樣的函數也會精確到做我的String.trim所做的事情,這樣你就不會在你的Web應用程序工作流程中看到任何差異。

像覆蓋querySelectorAll這樣更復雜的函數可能會導致瀏覽器實現它和實現之間的差異。例如:返回的元素的順序可能不同,瀏覽器函數返回一個集合,而你的一個數組和其他問題。所以當你在實現querySelectorAll的瀏覽器上運行你的webapp時,它可能會導致你的webapp不能按預期工作,並且在那裏試着找出bug!

也許querySelectorAll不是最好的例子,但我希望我解釋了這個概念。