在ES5中,Boolean.prototype是一个布尔对象:
布尔原型对象本身就是一个布尔对象(其[Class]为" Boolean "),其值为false。
在ES6 / ES2015中,它不是:
布尔原型对象是一个普通的对象。它不是布尔实例,也没有[BooleanData]内部插槽。
在ES2016中,再一次是:
布尔原型本身就是一个布尔对象;它有一个[BooleanData]内部槽,其值为false。
(在ES2017中也是如此。)
另一方面,Number.prototype和String.prototype-while也是如此,Date.prototype和RegExp.prototype也是从ES5.1中各自[Class]es的实例开始的,在ES6中变成了普通的Objects,此后一直是这样。
在ES2016中,reversion似乎不是任何tc39提案的主题。
为什么这些更改是在ES6中进行的,然后(仅)部分地在ES2016中恢复呢?
(这个问题不仅仅是为了学术/历史利益:我正在研究一种JavaScript方言,它不打算包含装箱的原语类型,但仍然要求.prototype对象保存所有可以在原语值上调用的方法,尽管将.prototype对象作为它们各自[Class]es的唯一实例是可行的,但我想了解为什么这可能是可取的)。
发布于 2018-06-13 08:22:02
我还没有找到关于为什么这些对象在Object中成为普通ES6的完整解释,但是回滚的原因似乎是因为它导致了意想不到的问题:来自"Number.prototype不是一个实例也破坏了网络“,在esdiscuss.org上。
V8昨天刚刚将一个更改转到金丝雀中,实现了Number.prototype (和Boolean.prototype)作为普通对象的新的ES6语义。不幸的是,这似乎打破了网络。特别是jsfiddle.net/#run现在无法加载。 我在该页面上看到的是在此函数中抛出的TypeError "Number.prototype.valueOf不是泛型的“(可能是moo工具的一部分): $isFinite= function(){返回(这个)?‘'number’:'null';}.hide(); 在Number.prototype上调用之后。 AFAICS,这只剩下一个选项:退出这个规范更改。 -Andreas罗斯伯格
而且似乎没有将回滚应用于Date.prototype和RegExp.prototype,因为它们带有可变状态:
从安全pov中,不恢复的重要内容是那些不被Object.freeze锁定的可变状态。在ES5中,这只是Date.prototype。在ES5内置的ES6中,现在包括了RegExp.prototype (因为RegExp.prototype.compile )。 -Mark S. Miller
https://stackoverflow.com/questions/50614565
复制相似问题