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
相关产品推荐
相关产品推荐

