javascript 中可以通过检查对象的 constructor 属性来推断其类型,具体做法是访问实例的 constructor 并判断它是否等于预期的构造函数(如 obj.constructor === array)。这种方法在对象未被篡改且处于同一全局执行上下文时有效,但如果对象跨 iframe 创建或 constructor 被手动修改,则会导致误判。

constructor 与原型链的关系是什么
constructor 属性默认存在于构造函数的 prototype 对象上,并通过原型链被实例继承。当访问 obj.constructor 时,JavaScript 引擎会沿着原型链向上查找,直到找到该属性为止。这意味着如果原型链被修改,constructor 的值也会随之改变。

function Person(name) {
this.name = name;
}
const p = new Person('Alice');
console.log(p.constructor === Person); // true
console.log(p.constructor === Object); // false修改原型后 constructor 会发生什么变化
如果在子类中直接替换了父类的原型对象,子类的 constructor 属性将不再指向子类本身,而是指向原来的父类构造函数,除非显式地重新设置 constructor 属性。这种行为容易导致类型判断出错,因为此时 instanceof 依然能正确识别继承关系,但 constructor 却指向了错误的构造函数。
立即学习“Java免费学习笔记(深入)”;

function Animal() {}
function Dog() {}
Dog.prototype = new Animal();
// 此时 Dog.prototype.constructor 指向 Animal
const d = new Dog();
console.log(d.constructor === Animal); // true (意外行为)
console.log(d.constructor === Dog); // false跨 iframe 环境中 constructor 判断为何失效
在跨 iframe 场景中,即使两个数组看起来完全一样,它们的 constructor 属性也分别指向各自 iframe 窗口中的不同 Array 构造函数。因此,使用 === 进行比较时会返回 false,导致基于 constructor 的类型判断失败。这是由 JavaScript 的多重全局环境机制决定的,每个 iframe 都有独立的执行上下文和内置对象引用。


















