最近看了一本相当不错的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代码文件中,有如下的一段代码:

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

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

但很不幸,即使将代码改成这样,那个SharePoint页面错误仍然存在。实际上,只要我们的自定义代码向Array对象的原型添加任何一个方法,比如Array.prototype.indexOf2,那个该死的“Type Mismatch”错误就会出现。要解决这个问题,只需要将所有添加给Array原型的方法移除,就可以了。

你瞧,我们总会遇到一些非常奇怪的问题,而解决它们总会让我们又学到一些新知识。:)

违反“Don’t Modify Objects You Don’t Own”原则对SharePoint页面带来的影响的更多相关文章

  1. Think Python - Chapter 15 - Classes and objects

    15.1 User-defined typesWe have used many of Python’s built-in types; now we are going to define a ne ...

  2. Objects are mutable

    We can change the state of an object by making an assignment to one of its attributes. For example, ...

  3. mysql ALTER COLUMN MODIFY COLUMN CHANGE COLUMN 区别及用法 (转)

    -- 设置或删除列的默认值.该操作会直接修改.frm文件而不涉及表数据.此操作很快 -- ALTER COLUMN ALTER TABLE  dsp_ad_center.XianDuan ALTER  ...

  4. 移动UI自动化-Page Objects Pattern

    移动UI自动化,看起来美好,践行起来却难.做个目光短见的务实主义者.Page Objects Pattern是Selenium官方推崇的方式,最近研究写测试用例最佳实践之Page Objects,同时 ...

  5. 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  6. 在MVC中使用泛型仓储模式和依赖注入实现增删查改

    标签: 原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository ...

  7. 读《Effect Java中文版》

    读<Effect Java中文版> 译者序 序 前言 第1章引言 1   第2章创建和销毁对象 4 第1条:考虑用静态工厂方法代替构造函数 4 第2条:使用私有构造函数强化singleto ...

  8. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q69-Q71)

    Question 69 You are designing an extranet site using SharePoint 2010. This site must allow employees ...

  9. RFID 基础/分类/编码/调制/传输

    不同频段的RFID产品会有不同的特性,本文详细介绍了无源的感应器在不同工作频率产品的特性以及主要的应用. 目前定义RFID产品的工作频率有低频.高频和甚高频的频率范围内的符合不同标准的不同的产品,而且 ...

随机推荐

  1. python编程规范系列--建议01~07

    本系列来自<编写高质量代码 改善python程序的91个建议>的读书笔记整理. 本书主要内容     1)容易被忽视的重要概念和常识,如代码的布局和编写函数的原则等:     2)编写py ...

  2. LNMP.ORG 安装LNMP

    参考:http://lnmp.org/install.html cd /usr/local/src wget -c http://soft.vpser.net/lnmp/lnmp1.3-full.ta ...

  3. 项目代码部署百度云(使用git部署,node环境)

    学习做了一个小demo,总是在自己的电脑,和局域网上运行很没意思,现在就做点有意思的事情,将代码部署百度云. 1)首先你得进入百度云(直接百度,先要注册一个账号) 2)点击那个“应用引擎”,就会进入 ...

  4. 初识php,开发环境的配置

    PHP开发环境配置和第一个PHP程序(phpStudy+PhpStorm) 第一步 下载phpStudy 首先,到phpStudy官网上下载最新的phpStudy版本. 第二步 安装phpStudy ...

  5. 搭建基于hyperledger fabric的联盟社区(三) --生成公私钥证书及配置文件

    一.生成公私钥和证书 Fabric中有两种类型的公私钥和证书,一种是给节点之前通讯安全而准备的TLS证书,另一种是用户登录和权限控制的用户证书.这些证书本来应该是由CA来颁发,但是目前只有两个社区,所 ...

  6. proxool 连接池

    今天配置proxool 连接池,发现可配置属性非常多,以前也只是用,没总结过,今天查了下网上的资料,总结一下 方便你我.其实网上很多英文资料都很全,网上很多人就是考翻译老外的文章赚些流量,其实也没啥意 ...

  7. JVM内存管理之杂谈(借此也论一论obj=null)

    作为一个程序猿,修炼的过程就犹如玄幻小说中的主角,不仅需要练习各种武技,内气的修炼的一样重要.虽然武技可以迅速的提升主角的实力,但是在内气太差的情况下,根本发挥不出武技的十之一二. 因此,在介绍过设计 ...

  8. Php处理时间的函数

    1,字符串与时间: 例如 $time = strtotime("2007-3-5"); echo date("Y-m-d H:i:s",$time); 2,当前 ...

  9. 5月12日上课笔记-js 弹出框、函数、程序调试、基本事件、浏览器对象模型

    一.弹出框 a.提示框 alert(); b.输入框 prompt(); c.确认框 confirm(); var flag= confirm("确认删除吗?"); 二.js程序调 ...

  10. 【POJ】3616 Milking Time(dp)

    Milking Time Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10898   Accepted: 4591 Des ...