JavaScript命名冲突不可避免?( 二 )


然而 , 如果我们对一个普通库的方法使用这种技术 , 然后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
然而 , 以下模式经常被用来确定当前平台:
if( typeofglobal!== 'undefined') { // We are not running on Node.js}如果浏览器也有一个名为.global的全局变量 , 这种模式(以及类似的模式)就会失效 。 因此 , 标准化的名称被改为.global globalThis。
冲突源4:通过创建局部变量with 语句
Java的声明with 语句
长期以来 , 人们一直不鼓励使用Java的with语句 , 甚至在ES5中引入的严格模式中也被定为非法 。 在其他地方 , 严格模式在ECMA模块中是活跃的 。
该语句将一个对象的属性变成局部变量:with
cons t myObject = {ownProperty: 'yes', };with(myObject) { // Own properties become local variablesassert.equal(ownProperty, 'yes');
// Inherited properties become local variables, tooassert.equal(typeoftoString, 'function');}
由with语句引起的冲突
框架Ext.js使用的代码与下面的片段有些相似点:
functionmyFunc( values) { with(values) { console.log(values); // (A)}}myFunc([]); // (B)当ES6方法被添加到Java中时 , 如果用Array(B行)来调用它 , 它就会失效 。 该语句将Array的所有属性变成了局部变量 。 其中一个是继承的属性 。 因此 , A行中的语句已记录 , 不再是参数(错误报告1 , 错误报告2)
Array.prototype.valuesmyFuncwithvalues.valuesArray.prototype.values value
Unscopables:防止with导致的冲突
公共符号 Symbol.unscopables 允许对象隐藏语句中的某些属性 。 它只在标准库中使用一次 , 对于Array.prototype:with
assert.deepEqual(Array.prototype[ Symbol.unscopables], {__proto__: null, at: true, copyWithin: true, entries: true, fill: true, find: true, findIndex: true, flat: true, flatMap: true, includes: true, keys: true, values: true, });结论
以上提出了Java结构与现有代码发生名称冲突的四种方式:

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