JavaScript命名冲突不可避免?

【CSDN 编者按】从1995年开始 , 本文作者Dr.Axel Rauschmayer就专门从事Java和Web开发 , 已经有30多年了 。 2010年 , 他获得慕尼黑大学信息学博士学位 。 自2011年以来 , 他一直在2ality.com写博客 , 并写了几本关于Java的书 , 比如《Java for impatient programmers》、《Deep Java: Theory and techniques》等 。 今天这篇文章就来自于他的博客 , 介绍了在Java命名冲突时 , 现有代码如何强制对提议的功能进行重命名 。
整理 | 章雨铭 责编 | 张红月
出品 | CSDN(ID:CSDNnews)
不断发展的Java:不要破坏web!
Java的一个发展核心原则就是"不要破坏Web":在将新特性添加到语言中后 , 所有现有代码都必须能够继续运行 。
这样有一个坏处 , 就是不能从语言中删除现有的quirks 。 但这样做益处多多 , 比如旧的代码可以继续运行 , 而且升级到新的ECMA版本很简便等等 。
在为新特征(如方法名称)选择名称时 , 需要进行一个重要的测试 , 即在浏览器的nightly版本(早期预发布版本)中添加该特征 , 并检查是否有任何网站出现错误 。
接下来将介绍过去案例中的的四个冲突源 , 当产生这四种冲突时 , 就必须重命名特征 。
冲突源1:向内置原型添加方法
在Java中 , 我们可以通过改变其原型来为内置值添加方法:

// Creating a new Array method Array.prototype.myArrayMethod = function( ) {returnthis.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)代码 。
反对改变内置原型的原因
对任何类型的全局命名 , 都会存在名称冲突的风险 。 如果有解决冲突的机制 , 就能规避风险 。 例如:
  • 可以通过将符号添加到Java中 , 以避免方法之间的名称冲突 。 例如 , 任何对象都可以通过添加一个键为.NET的方法而成为可迭代的 。 由于每个符号都是唯一的 , 所以这个键永远不会与任何其他属性键 . Symbol.iterator 发生冲突 。
【JavaScript命名冲突不可避免?】然而 , 带有字符串键的方法会导致名称冲突:
  • 不同的库可能会对他们添加到 .Array.prototype 的方法使用相同的名字 。
  • 如果一个名字已经被某个库使用了 , 那么这个名称就不能用于命名Java标准库的一个新特性 。
具有讽刺意味的是 , 谨慎地添加一个方法可能会适得其反:
if(! Array.prototype.libraryMethod) { Array.prototype.libraryMethod = function( ) { /*...*/}; }我们会检查一个方法是否已经存在 。 如果没有 , 我们就添加它 。
如果我们要实现一个polyfill(模拟原生Web平台功能) , 将新的Java方法添加到不支持它的引擎中 , 那么这个技术就能发挥作用 。 (顺便说一下 , 这是修改内置原型的一个合法用例 。 也许是唯一的一个) 。

特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。