繁体   English   中英

试图了解有关Symbol.hasInstance的官方ES6规范

[英]Trying to understand the official ES6 spec regarding Symbol.hasInstance

关于Symbol.hasInstance的ECMAScript 2015官方规范写道

此属性(指Symbol.hasInstance)是不可写的且不可配置的,以防止可用于全局公开绑定函数的目标函数的篡改。

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

我不明白这句话。

假设在重写目标的Symbol.hasInstance以返回true时,在绑定函数的情况下,可能会公开全局函数。 自然地,它将返回false,因为目标将其原型交换到绑定函数上,因此绑定函数不是目标的实例。 而且,据我所知,我相信它将最终出现在全局范围内的原因是因为绑定函数没有原型,因此在物理上不能成为目标函数的实例,因此,如果将其强制为实例,则目标的原型被迫在不存在束缚的原型,它最终以失败告终,并把目标的this对全球范围。 但是,即使将其设置为true,我仍然无法使它全局地公开目标。

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

我已经尝试了数小时的摆弄绑定函数的一系列代码片段,并且Symbol.hasInstance返回true但无济于事。 我无法获得它以全局方式公开目标的功能和数据。 如果有人更好地理解这一点,将不胜感激。 我撞到了砖墙。

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

该规范的最新版本中的文本为:

此属性是不可写的且不可配置的,以防止可能被用来全局公开绑定函数的目标函数的篡改。

这是说您不能做的事情:

// 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 ,否则该类将是完全私有的并且在IIFE范围内。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM