最近看了一本相当不错的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. dict 没有 key 的情况

    如何处理, 请参考下文,  主要是要理解思路, https://www.polarxiong.com/archives/Python-%E6%93%8D%E4%BD%9Cdict%E6%97%B6%E ...

  2. python模块--hashlib

    用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供SHA1,SHA224,SHA256,SHA384,SHA512,MD5算法 import hashlib m = hashlib.m ...

  3. spring 自动扫描组件

    在Spring2.5中,有4种类型的组件自动扫描注释类型 @Component – 指示自动扫描组件. @Repository – 表示在持久层DAO组件. @Service – 表示在业务层服务组件 ...

  4. sqlserver docker 安装部署试用

    1. 镜像   docker pull exoplatform/sqlserver 2. 镜像参数    docker run -d -e SA_PASSWORD=<passord> -e ...

  5. WebSocket的使用

    WebSocket是长连接,如果客户端的程序没有数据实时同步的需求就没必要使用它.因为长连接会带来一定的服务器内存开销.如果Ajax就能轻松搞定的话就完全没必要兴师动众的搞WebSocket. htt ...

  6. Hyper-V 手动导入虚机配置实例(转载)

    原文转载:http://blog.51cto.com/bobzy/980241 Hyper-V提供了很方便的虚机导入和导出功能.平时假如我们想导出虚机,先选中虚机,然后鼠标右键在出现菜单列表中选中“导 ...

  7. 在 CentOS 7.2 上安装 ODOO 10 (2018-10-09 持续更新)

    在 CentOS 7.2 上安装 ODOO 10 更新系统 yum update 安装 EPEL 源 1 yum install -y epel-release 安装依赖组件 yum install ...

  8. 历届试题 小数第n位(小技巧)

    问题描述 我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数. 如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式. 本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始 ...

  9. phpstudy mysql无法启动

    在安装好phpstudy后,Apache可以启动,Mysql无法启动. 以管理员的身份运行cmd,然后输入sc delete mysql  即可

  10. java web 程序---猜数字游戏的猜了多少次的代码

    思路:用setAttribute()放 ,然后直接输出 Integer str=(Integer)session.getAttribute("count"); int num3= ...