违反“Don’t Modify Objects You Don’t Own”原则对SharePoint页面带来的影响

最近看了一本至关不错的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部件”按钮后,什么也没有发生…工具

image

若是使用浏览器自带的开发工具查看console输出,你就会发现一个Type mismatch的脚本错误,而它的来源,尽然来自SharePoint自带的wpadder.debug.js文件。开发工具

image

若是你是第一次遇到这个问题,那么我相信你须要花费大量的时间来调试并找出问题的所在。实际上,引起这个问题的缘由,是在咱们的某一个自定义JavaScript代码文件中,有以下的一段代码:prototype

image

这段代码的做用很简单,它为Array对象的原型添加了一个indexOf()方法,这样,在全部的数组对象上,就可使用indexOf()方法,来确认某个元素的位置。很常见的JavaScript技巧。debug

“等等,”你可能会说,“实际上,在为一个内置对象的原型添加某个方法以前,最好检查一下这个方法是否是已经被定义过了!”我明白你的意思,你说得很对,(实际上,更新版本的JavaScript里面确实已经在Array的原型上定义了原生的indexOf()方法,但并不是全部浏览器都支持)在这里,代码应该这样写:3d

image

但很不幸,即便将代码改为这样,那个SharePoint页面错误仍然存在。实际上,只要咱们的自定义代码向Array对象的原型添加任何一个方法,好比Array.prototype.indexOf2,那个该死的“Type Mismatch”错误就会出现。要解决这个问题,只须要将全部添加给Array原型的方法移除,就能够了。调试

你瞧,咱们总会遇到一些很是奇怪的问题,而解决它们总会让咱们又学到一些新知识。:)对象

相关文章
相关标签/搜索