对象的constructor属性指向创建它的构造函数,可读取或用于类型判断、实例重建;但对象字面量、object.create(null)、箭头函数等场景存在限制。

直接访问对象的 constructor 属性就能拿到创建它的构造函数。这个属性是对象从原型链上继承来的,指向实际调用 new 时使用的那个类或函数。
基础用法:直接读取 constructor
所有通过 new 创建的实例(包括数组、日期、自定义类等)都自带 constructor 属性:
-
const arr = [];→arr.constructor === Array为 true -
const d = new Date();→d.constructor === Date为 true -
class Cat {} const c = new Cat();→c.constructor === Cat为 true
获取构造函数名称字符串
如果只需要类名,用 .name 最简洁(现代浏览器支持):
-
obj.constructor.name返回字符串,如"Array"、"Cat" - 兼容老环境可回退:
obj.constructor.toString().match(/function\s+(\w+)/)?.[1]
用于类型判断和重建实例
constructor 不仅能“看”,还能“用”:
- 精准类型识别:
if (item.constructor === User) { ... }(区别于instanceof,它不会对父类返回 true) - 同类型重建:
const clone = new item.constructor(item.name, item.age)(需确保构造函数签名一致) - 工厂逻辑中分发处理:
switch (inst.constructor.name) { case 'User': ... break; }
注意边界情况
不是所有对象都可靠提供 constructor:
- 对象字面量
{}的constructor指向Object,但它是隐式创建的,不反映“意图” -
Object.create(null)完全没有constructor属性 - 箭头函数不能当构造器,也没有
prototype,因此无法产生带有效constructor的实例 - 手动改写
Sub.prototype.constructor后未重置,会导致指向错误,需显式修复











