然而 , 如果我们对一个普通库的方法使用这种技术 , 然后Java获取具有相同名称的方法 , 那么这两种实现的工作方式就不一样了 , 并且使用库方法的所有代码在使用内置方法时都会中断 。
必须更改名称的原型方法示例
- ES6的方法最初是与Java框架MooTools( 错误报告 ) .String.prototype.includes.contains 全局添加的方法相冲突 。
- ES2016的方法最初是与MooTools( 错误报告 ) .Array.prototype.includes.contains 添加的方法相冲突 。
- ES2019的方法最初是和MooTools( 错误报告,博客文章 ) .Array.prototype.flat.flatten 相冲突 。
你可能会对 MooTools的创建者的 粗心大意感到疑惑 。 但是 , 向内置原型 添加方法并不总是糟糕的 。 在ES3(1999年12月)和ES5(2009年12月)之间 , Java是一种停滞不前的语言 。 MooTools和Prototype等框架改进了它 。 这些方法的缺点只有在Java的标准库再次增加之后才会凸显出来 。
冲突源2:检查一个属性的存在
ES2022的方法最初是.NET的 。 因为以下库检查属性以确定对象是否是一个HTML集合(而不是一个数组) , 所以它必须被重新命名:Magic360、YUI 2、YUI 3.Array.prototype.at.item.item
冲突源3:检查全局变量是否存在
自ES2020以来 , 我们可以通过globalThis 访问全局对象 。 Node.js一直使用该名称来实现此目的 。 最初的计划是为所有平台标准化该名称.global
然而 , 以下模式经常被用来确定当前平台:
冲突源4:通过创建局部变量with 语句
Java的声明with 语句
长期以来 , 人们一直不鼓励使用Java的with语句 , 甚至在ES5中引入的严格模式中也被定为非法 。 在其他地方 , 严格模式在ECMA模块中是活跃的 。
该语句将一个对象的属性变成局部变量:with
// Inherited properties become local variables, tooassert.equal(typeoftoString, 'function');}
由with语句引起的冲突
框架Ext.js使用的代码与下面的片段有些相似点:
Array.prototype.valuesmyFuncwithvalues.valuesArray.prototype.values value
Unscopables:防止with导致的冲突
公共符号 Symbol.unscopables 允许对象隐藏语句中的某些属性 。 它只在标准库中使用一次 , 对于Array.prototype:with
以上提出了Java结构与现有代码发生名称冲突的四种方式:
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
