【CSDN 编者按】
从1995年开始,本文作者Dr.Axel Rauschmayer就专门从事JAVAScript和Web开发,已经有30多年了 。2010年,他获得慕尼黑大学信息学博士学位 。自2011年以来,他一直在2ality.com写博客,并写了几本关于JavaScript的书,比如《JavaScript for impatient programmers》、《Deep JavaScript: Theory and techniques》等 。今天这篇文章就来自于他的博客,介绍了在JavaScript命名冲突时,现有代码如何强制对提议的功能进行重命名 。【JavaScript命名冲突不可避免?】整理 | 章雨铭 责编 | 张红月
出品 | CSDN(ID:CSDNnews)

文章插图
不断发展的JavaScript:不要破坏web!
JavaScript的一个发展核心原则就是"不要破坏Web":在将新特性添加到语言中后,所有现有代码都必须能够继续运行 。
这样有一个坏处,就是不能从语言中删除现有的quirks 。但这样做益处多多,比如旧的代码可以继续运行,而且升级到新的ECMAScript版本很简便等等 。
在为新特征(如方法名称)选择名称时,需要进行一个重要的测试,即在浏览器的nightly版本(早期预发布版本)中添加该特征,并检查是否有任何网站出现错误 。
接下来将介绍过去案例中的的四个冲突源,当产生这四种冲突时,就必须重命名特征 。

文章插图
冲突源1:向内置原型添加方法
在JavaScript中,我们可以通过改变其原型来为内置值添加方法:
// Creating a new Array methodArray.prototype.myArrayMethod = function{ return this.join('-');};assert.equal( ['a', 'b', 'c'].myArrayMethod, 'a-b-c');// Creating a new string methodString.prototype.myStringMethod = function{ return '¡' + this + '!';};assert.equal( 'Hola'.myStringMethod, '¡Hola!');神奇的是,语言可以通过这种方式改变 。这种运行时的修改被称为猴子补丁(monkey patch) 。什么是猴子补丁?
如果我们给内置原型添加方法,我们就是在运行时修改一个软件系统 。这样的修改被称为猴子补丁 。简单来说,对其含义有两种可能的解释 。
这个叫法起源于Zope框架,人们在修正Zope的Bug的时候经常在程序后面追加更新部分,这些被称作是“杂牌军补丁(guerilla patch)”,后来guerilla就渐渐的写成了gorllia((猩猩),再后来就写了monkey(猴子),所以猴子补丁的叫法是这么莫名其妙的得来的 。
另一种说法是,它指的是搞乱(monkeying about)代码 。
反对改变内置原型的原因
对任何类型的全局命名,都会存在名称冲突的风险 。如果有解决冲突的机制,就能规避风险 。例如:
- 全局模块是通过裸模块指定器或URLs来识别的 。前者之间的名称冲突可以通过npm注册表来解决 。后者之间的名称冲突可以通过域名注册处来解决 。
- 可以通过将符号添加到JavaScript中,以避免方法之间的名称冲突 。例如,任何对象都可以通过添加一个键为.NET的方法而成为可迭代的 。由于每个符号都是唯一的,所以这个键永远不会与任何其他属性键.
Symbol.iterator发生冲突 。
- 不同的库可能会对他们添加到
.Array.prototype的方法使用相同的名字 。
- 如果一个名字已经被某个库使用了,那么这个名称就不能用于命名JavaScript标准库的一个新特性 。
if (!Array.prototype.libraryMethod) { Array.prototype.libraryMethod = function{ /*...*/ };}我们会检查一个方法是否已经存在 。如果没有,我们就添加它 。如果我们要实现一个polyfill(模拟原生Web平台功能),将新的JavaScript方法添加到不支持它的引擎中,那么这个技术就能发挥作用 。(顺便说一下,这是修改内置原型的一个合法用例 。也许是唯一的一个) 。
然而,如果我们对一个普通库的方法使用这种技术,然后JavaScript获取具有相同名称的方法,那么这两种实现的工作方式就不一样了,并且使用库方法的所有代码在使用内置方法时都会中断 。
必须更改名称的原型方法示例
推荐阅读
- JavaScript 继承全解析
- JavaScript面向对象—继承的实现
- JavaScript 变量的秘密,你知道吗
- JavaScript的ID生成器-Nano ID
- JavaScript 内置对象之——Date,看完你会更清晰
- 在微控制器平台等小型物联网设备上运行 JavaScript
- 3种Javascript图片预加载的方法详解
- JavaScript,面向对象,实现继承,对象冒充和原型链继承,代码
- 17 个高频好用的JavaScript 代码块
- 20条JavaScript代码简洁的写法
