最近看了一本至關不錯的JavaScript書,《Maintainable JavaScript》(中文版叫作《編寫可維護的JavaScript》),「Don’t Modify Objects You Don’t Own」是這本書第11章的標題,它的意思是,不要去修改不屬於你的對象。因爲JavaScript動態語言的特性,理論上,咱們能夠隨意的修改任何JavaScript對象(不是說修改對象某個field的值),好比爲它們添加一個方法,或是修改原來某個方法的實現。可是從可維護的角度出發,咱們不該該在本身的模塊中,去隨意修改不是由咱們本身「管理」的對象,由於咱們永遠不知道本身的修改,會產生什麼額外的影響,帶來一個什麼樣的結果。數組
這個原則和SharePoint有什麼關係呢?嗯,之前我就曾經遇到過一個很是奇怪,曾經花費了我不少時間去debug的一個SharePoint頁面錯誤,而這個錯誤的起始由來,就是由於在咱們的代碼中,違反了這個「Don’t Modify Objects You Don’t Own」原則。瀏覽器
首先介紹一下這個頁面錯誤。這個錯誤很是容易發現,當用戶打開一個Web部件頁,而後進入到頁面編輯狀態,而後點擊「添加Web部件」按鈕。若是頁面工做正常,這時頁面上方應該會出現Web部件類別和Web部件的列表,讓用戶選擇要添加的Web部件。可是奇怪的是,用戶點擊「添加Web部件」按鈕後,什麼也沒有發生…工具
若是使用瀏覽器自帶的開發工具查看console輸出,你就會發現一個Type mismatch的腳本錯誤,而它的來源,盡然來自SharePoint自帶的wpadder.debug.js文件。開發工具
若是你是第一次遇到這個問題,那麼我相信你須要花費大量的時間來調試並找出問題的所在。實際上,引起這個問題的緣由,是在咱們的某一個自定義JavaScript代碼文件中,有以下的一段代碼:prototype
這段代碼的做用很簡單,它爲Array對象的原型添加了一個indexOf()方法,這樣,在全部的數組對象上,就可使用indexOf()方法,來確認某個元素的位置。很常見的JavaScript技巧。debug
「等等,」你可能會說,「實際上,在爲一個內置對象的原型添加某個方法以前,最好檢查一下這個方法是否是已經被定義過了!」我明白你的意思,你說得很對,(實際上,更新版本的JavaScript裏面確實已經在Array的原型上定義了原生的indexOf()方法,但並不是全部瀏覽器都支持)在這裏,代碼應該這樣寫:3d
但很不幸,即便將代碼改爲這樣,那個SharePoint頁面錯誤仍然存在。實際上,只要咱們的自定義代碼向Array對象的原型添加任何一個方法,好比Array.prototype.indexOf2,那個該死的「Type Mismatch」錯誤就會出現。要解決這個問題,只須要將全部添加給Array原型的方法移除,就能夠了。調試
你瞧,咱們總會遇到一些很是奇怪的問題,而解決它們總會讓咱們又學到一些新知識。:)對象