【发布时间】:2020-10-29 09:06:40
【问题描述】:
我的客户基于 Chromium 构建自己的应用程序,他们的 navigator.appVersion 是 AppleWebkit/534+
但令我惊讶的是,他们用自己的替换了 javascript 标准内置对象,例如,查看下面的地图,
他们的 Map 有类似的方法,
arr:Array[0]
isEmpty:function
remove:function
但是没有像 has, keys, values 这样的标准 Map 方法,在这里查看 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map(顺便说一句,我们在这里需要 Map 而不是普通的 js 对象的原因是我们需要密钥不是字符串)
我很好奇,他们是怎么做到的?为什么会有人这样做!!
更重要的是如何恢复构建版本?
【问题讨论】:
-
只需覆盖
Map构造函数。这没有什么不寻常的,即使它是不明智的。 -
如果这是一个旧项目(至少可以追溯到 5 年以上),他们可能会用自己的抢占 ECMAScript 的标准
Map对象。并不是他们故意覆盖它,而是他们不能等待浏览器原生支持它 - 基本上是 polyfill/ponyfill,除了他们使用不同的对象接口。 -
我认为现在更重要的问题是如何恢复内置版本。
-
“我如何恢复内置版本” - 我认为你不能。一旦构造函数(即使是像
Map这样的引擎提供的构造函数)被覆盖,您将无法取回它 - 至少在不创建单独的新global(又名window)上下文的情况下无法取回 - 但据我所知不能保证能够在不同的 JS 上下文之间传递构造函数(假设构造函数不可序列化) -
但是到目前为止我得到的答案呢?以及除了 Map = function() { ... } 有多少种方法可以覆盖 Map 构造函数
标签: javascript chromium v8