【发布时间】:2016-11-07 23:24:06
【问题描述】:
关于 Symbol.hasInstance writes 的 ECMAScript 2015 官方规范:
这个属性(指 Symbol.hasInstance)是不可写的并且 不可配置以防止可用于全局的篡改 暴露绑定函数的目标函数。
现在,即使是不可写和不可配置的属性也可以用 Object.defineProperty() 覆盖,实际上,如果您尝试覆盖 Symbol.hasInstance 以始终返回 true,那么它会这样做。
我不明白报价。
可能会暴露全局函数的场景是在绑定函数的情况下,当您覆盖目标的 Symbol.hasInstance 以返回 true 时。自然它会返回 false,因为目标将其原型交换到绑定函数上,因此绑定函数不是目标的实例。另外,据我所知,我相信它最终会出现在全局范围内的原因是因为绑定函数没有原型,因此实际上不能成为目标函数的实例,所以如果你强制它作为实例,那么目标的原型强制在 不存在 绑定原型上,最终失败并将目标的 this 置于全局范围内。但是,即使我将它设置为返回 true,我仍然无法让它在全局范围内公开目标。
注意,这是我试图做的事情,以更好地理解 JavaScript 的内部工作原理。在实际应用中,我不想全局公开目标。
我已经尝试了数小时的时间摆弄一系列绑定函数的代码 sn-ps 和 Symbol.hasInstance 返回 true,但无济于事。我无法让它在全球范围内公开目标的功能和数据。如果有人更好地理解这一点,那将不胜感激。我撞到了一堵砖墙。
【问题讨论】:
-
我猜防篡改工作。
-
它不能阻止完全篡改。如果使用 Object.defineProperty(),即使 Symbol.hasInstance 不可写,也绝对可以覆盖它。我已经覆盖了很多次。仅将其设置为不可写以防止标准重新分配。
-
不幸的是,它并没有真正解决我的问题。这是一篇很棒的文章,感谢您指出。
-
我试图理解规范 sn-p 以便能够完成我正在写的关于知名符号的文章。我相信我理解为什么它最终会出现在全球范围内的理论;但是,无法实现证明它的 sn-p 意味着我无法完成这篇文章(并且可能我的理解存在缺陷)。理论是,由于绑定函数没有原型,因此强制绑定函数的不存在原型成为目标的实例将导致分配失败,从而触发对全局范围的默认分配。