gpt4 book ai didi

javascript - 尝试了解有关 Symbol.hasInstance 的官方 ES6 规范

转载 作者:行者123 更新时间:2023-12-03 06:35:52 25 4
gpt4 key购买 nike

Symbol.hasInstance 的 ECMAScript 2015 官方规范 writes :

This property (referring to Symbol.hasInstance) is non-writable and non-configurable to prevent tampering that could be used to globally expose the target function of a bound function.

现在,即使是不可写和不可配置的属性也可以用 Object.defineProperty() 覆盖,事实上,如果您尝试覆盖 Symbol.hasInstance 以始终返回 true,那么它就会这样做。

虽然我不明白这句话。

大概,当您覆盖目标的 Symbol.hasInstance 以返回 true 时,全局函数可能会被暴露的情况是绑定(bind)函数的情况。当然它会返回 false,因为目标将其原型(prototype)交换到绑定(bind)函数上,因此绑定(bind)函数不是目标的实例。另外,根据我的最佳理解,我相信它最终会出现在全局范围内的原因是因为绑定(bind)函数没有原型(prototype),因此实际上不能成为目标函数的实例,因此如果您强制将其作为实例,那么目标的原型(prototype)被强制作用于不存在绑定(bind)原型(prototype),最终会失败并将目标的this置于全局范围内。但是,即使我将其设置为返回 true,我仍然无法让它在全局范围内公开目标。

注意,这是我试图做的事情,以更好地理解 JavaScript 的内部工作原理。在实际应用中,我不想在全局范围内公开目标。

我已经尝试了好几个小时摆弄一系列绑定(bind)函数的代码片段,并且 Symbol.hasInstance 返回 true 但没有效果。我无法让它在全局范围内公开目标的功能和数据。如果有人更好地理解这一点,我们将不胜感激。我碰壁了。

最佳答案

让我们澄清一下,您正在谈论 19.2.3.6 部分规范的规范,即 Function.prototype[Symbol.hasInstance] 的规范。

最新版本规范中的文本是:

This property is non-writable and non-configurable to prevent tampering that could be used to globally expose the target function of a bound function.

这意味着你不能这样做:

// A malicious library loads here and overrides the function.
(function(){
Object.defineProperty(Function.prototype, Symbol.hasInstance, {
value: function(instance){
const context = this;

// Here, `this === SomeClass`
},
});
}();

// Some library loads here.
(function(){
function SomeClass(){}

const BoundClass = SomeClass.bind(null);

var tmp = {} instanceof BoundClass;
})();

因此,在这个示例中,如果该属性是configurable: true,则恶意库将能够访问SomeClass,否则该属性将是完全私有(private)且有作用域的在 IIFE 内。

关于javascript - 尝试了解有关 Symbol.hasInstance 的官方 ES6 规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38215027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com