You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Boolean/String/Number.prototype再度为对应对象,Date/RegExp却不如此?

关于Boolean.prototype等原型对象的标准变更疑问

在ES5中,Boolean.prototype是一个Boolean对象:

Boolean原型对象本身是一个Boolean对象(其[[Class]]为"Boolean"),其值为false。

到了ES6/ES2015,它的性质发生了变化:

Boolean原型对象是一个普通对象。它不是Boolean实例,也没有[[BooleanData]]内部槽位。

而在ES2016(以及ES2017)中,它又再度成为了Boolean对象:

Boolean原型本身是一个Boolean对象;它拥有一个值为false的[[BooleanData]]内部槽位。

类似的情况也出现在Number.prototype和String.prototype上,但Date.prototype和RegExp.prototype的走向不同——它们在ES5.1里是各自[[Class]]的实例,到ES6转为普通Object后就一直保持这个状态了。

有意思的是,ES2016这次针对Boolean、Number、String原型的恢复变更,似乎并没有成为任何TC39提案的主题。

我现在有个疑问:为什么这些变更会先在ES6里实施,之后又仅针对部分原型在ES2016中恢复呢?

(说起来这不是单纯的学术/历史问题:我正在开发一种JavaScript方言,它不打算包含装箱原始类型,但仍需要.prototype对象来存储能在原始值上调用的所有方法。虽然可以把.prototype对象特殊处理成各自[[Class]]的唯一实例,但我想知道这么做的合理性何在。)

内容的提问来源于stack exchange,提问作者cpcallen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:34:52