constructor属性指向创建对象的构造函数,是原型对象自带的、非实例自有属性;直接重写prototype会丢失该属性,需手动修复;它不可靠,类型判断应优先使用array.isarray()等方法。

constructor 属性指向创建该对象的构造函数,它不是实例自己拥有的属性,而是从原型链上继承来的。
constructor 是原型对象自带的属性
每个函数(包括构造函数)都有一个 prototype 属性,它指向一个对象,这个对象就是“原型对象”。这个原型对象一创建,就会自动拥有一个 constructor 属性,值就是该函数本身。
- 例如:
function Person() {},那么Person.prototype.constructor === Person为 true - 这个关系是语言规范设定的,不是手动添加的
- 即使你没在代码里写
Person.prototype.constructor = Person,它也天然存在
实例对象通过原型链访问 constructor
用 new Person() 创建的实例没有自己的 constructor 属性,但它能读到,是因为它的 __proto__ 指向 Person.prototype,从而沿原型链找到那个 constructor。
const p = new Person();-
p.constructor实际查的是p.__proto__.constructor,也就是Person.prototype.constructor - 所以
p.constructor === Person成立
修改 prototype 时容易丢失 constructor
当你直接给构造函数的 prototype 赋一个新对象(比如用对象字面量重写),那个新对象默认没有 constructor 属性,或者它的 constructor 会指向 Object,导致类型信息丢失。
- 错误写法:
Person.prototype = { say() {} };→ 此时Person.prototype.constructor指向Object - 正确补救:
Person.prototype.constructor = Person; - 更稳妥的方式:用
Object.defineProperty设置writable: false来保护它
constructor 不是绝对可靠的类型判断依据
虽然 obj.constructor === Array 看起来能判断数组,但要注意:这个属性可被修改,且跨 iframe 或不同执行上下文时可能失效。
-
let arr = [];→arr.constructor === Array通常成立 - 但
arr.constructor = String;后就不再反映真实类型 - 推荐用
Array.isArray()、instanceof或Object.prototype.toString.call()做类型检测
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











