我的客户端基于Chromium构建自己的应用程序,他们的navigator.appVersion是navigator.appVersion

但令我惊讶的是,他们用自己的内置对象替换了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 (BTW,我们这里需要Map而不是普通js对象的原因是我们需要键而不是字符串)
我很好奇,他们是怎么做到的?为什么有人要这么做!!
更重要的是,我如何在版本中恢复构建?

发布于 2020-10-29 09:30:24
我也有一个问题,就是全局函数被覆盖了。
我的诀窍是使用contentWindow的iframe来获取原始函数:
下面是代码,由于iframe策略,它在StackOverflow的代码片段中不起作用,但是它应该适用于您的环境:
// contaminated Map
Map = function() {
this.foo = 'bar';
}
const map1 = new Map();
console.log(map1);
// restoring Map
const iframe = document.createElement('iframe');
document.body.append(iframe);
const OriginalMap = iframe.contentWindow.Map;
iframe.remove();
const map2 = new OriginalMap();
map2.set('foo', 'bar');
console.log(map2);下面的截图显示了它的工作原理:

这更像是一种解决办法,不确定是否有更好的方法。
发布于 2020-10-29 15:51:47
他们是怎么做到的?
很简单,就像:
Map = function() { ... }为什么有人要这么做!
正如其他评论所猜测的,可能是因为代码比内置Map的可用性更早。如果同样的代码也应该在旧的浏览器上运行,那么这个考虑可能仍然是相关的。
如何在版本中还原构建?
另一个答案中的建议是一个有趣的想法..。我想不出更好的办法了。
尽管如此:我猜您的任务是对现有的代码基进行扩展/修改。在相同的代码库中有两个不同的Map听起来相当混乱--对于任何在您之后处理这段代码的人(可能是您自己,几个月后)来说,很难理解发生了什么事情。因此,我提出另一个建议:不要只在本地获得内置的Map,而是选择以下任何一种:
Map,替换手工构建的地图的所有用途,然后删除该定义。在任何地方使用内置Map。(尽管你的客户在这上面花费时间,但是他们是否同意)。
https://stackoverflow.com/questions/64587949
复制相似问题