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

Array、Object、Map属于内置构造函数还是内置类?

JavaScript内置"类"的混淆点解析

1. 为什么Array/Date/Object可以不用new调用?

这些是ES6之前就存在的内置构造函数,为兼容早期JS代码,被设计成支持两种调用方式:

  • 用new调用时,创建对应类型的实例,比如new Array(3)生成长度为3的数组实例;
  • 直接作为函数调用时,会执行特定的兼容逻辑,比如Array(3)和new Array(3)效果一致,Date()直接返回当前时间的字符串。

这种双重调用的设计是历史遗留方案,和ES6规范里的class完全不同——ES6的类必须用new调用,否则会抛出错误。

2. 为什么Map/Set显示为function ItsName() { [native code] }?

ES6新增的Map、Set等,虽然语义上属于"类",但底层依然基于构造函数模式实现,只是被严格限制必须用new调用(直接调用会触发TypeError)。

浏览器控制台打印它们时显示为function格式,是因为JS引擎对内置对象的输出逻辑沿用了旧的构造函数显示方式,并不代表它们不符合ES6类的语义。实际上它们的行为完全遵循ES6类的规则,比如不能当作普通函数执行、具备原型链继承特性等。

总结

  • ES6之前的内置构造函数(Array、Date、Object等):本质是函数,为兼容保留了双重调用方式,不是严格意义的ES6类;
  • ES6新增的内置构造函数(Map、Set等):语义上是类,行为符合ES6类规范,但引擎输出格式沿用旧的构造函数形式,且强制要求用new调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:20:41