首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何替换javascript标准内置对象?

如何替换javascript标准内置对象?
EN

Stack Overflow用户
提问于 2020-10-29 09:06:40
回答 2查看 235关注 0票数 0

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

但令我惊讶的是,他们用自己的内置对象替换了javascript标准的对象,例如,查看他们的Map,

他们的地图有这样的方法,

代码语言:javascript
复制
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对象的原因是我们需要键而不是字符串)

我很好奇,他们是怎么做到的?为什么有人要这么做!!

更重要的是,我如何在版本中恢复构建?

EN

回答 2

Stack Overflow用户

发布于 2020-10-29 09:30:24

我也有一个问题,就是全局函数被覆盖了。

我的诀窍是使用contentWindowiframe来获取原始函数:

下面是代码,由于iframe策略,它在StackOverflow的代码片段中不起作用,但是它应该适用于您的环境:

代码语言:javascript
复制
// 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);

下面的截图显示了它的工作原理:

这更像是一种解决办法,不确定是否有更好的方法。

票数 2
EN

Stack Overflow用户

发布于 2020-10-29 15:51:47

他们是怎么做到的?

很简单,就像:

代码语言:javascript
复制
Map = function() { ... }

为什么有人要这么做!

正如其他评论所猜测的,可能是因为代码比内置Map的可用性更早。如果同样的代码也应该在旧的浏览器上运行,那么这个考虑可能仍然是相关的。

如何在版本中还原构建?

另一个答案中的建议是一个有趣的想法..。我想不出更好的办法了。

尽管如此:我猜您的任务是对现有的代码基进行扩展/修改。在相同的代码库中有两个不同的Map听起来相当混乱--对于任何在您之后处理这段代码的人(可能是您自己,几个月后)来说,很难理解发生了什么事情。因此,我提出另一个建议:不要只在本地获得内置的Map,而是选择以下任何一种:

  • 使整个系统现代化,使用内置的JavaScript Map,替换手工构建的地图的所有用途,然后删除该定义。在任何地方使用内置Map。(尽管你的客户在这上面花费时间,但是他们是否同意)
  • 坚持使用它,并在新代码中使用手工制作的Map。虽然它的功能有不同的名称,但似乎所有重要的功能都在那里。您可能会找到一个例子,说明如何迭代这样一个映射。(这仍然会使上述选项成为未来的选择。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64587949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档