直接比较两个对象的__proto__是否相等即可判断它们是否继承自同一个原型,即共享同一个底层类元数据,本质是__proto__引用同一prototype对象;推荐使用Object.getPrototypeOf()替代非标准的__proto__。

直接比较两个对象的 __proto__ 是否相等,就能快速判断它们是否继承自同一个原型(即“共享同一个底层类元数据”)。
什么是“共享同一个底层类元数据”
在 JavaScript 中,所谓“类元数据”实际指构造函数的 prototype 对象。当用构造函数或 class 创建实例时,实例的 __proto__ 指向该构造函数的 prototype。因此,“共享同一个底层类元数据”本质是:两个对象的 __proto__ 引用同一个对象。
验证方法:直接比对 __proto__
只需一行代码:
objA.__proto__ === objB.__proto__
如果返回 true,说明二者原型链起点相同,即由同一构造器创建(或手动设置了相同原型)。
- 适用于普通对象字面量、
new实例、Object.create()创建的对象 - 注意:
__proto__是非标准但广泛支持的访问器;更规范的方式是用Object.getPrototypeOf(obj),效果完全等价 - 若对象是
null或原始值(如字符串字面量),会报错或返回undefined,需提前校验类型
常见陷阱与注意事项
以下情况看似相似,但 __proto__ 并不相等:
- 两个对象都用
{}字面量创建 → 它们的__proto__都指向Object.prototype,结果为true - 一个用
new Date(),另一个用new Array()→__proto__分别指向Date.prototype和Array.prototype,结果为false - 一个对象被修改过原型(如
obj.__proto__ = customProto),另一个没有 → 即使同源构造,也会不等 - 使用
Object.create(null)创建的对象,其__proto__为null,和任何其他对象都不等
替代方案:用 constructor 辅助判断(谨慎使用)
obj.constructor 可能被改写,不可靠;但若未篡改,可辅助确认:
-
objA.constructor === objB.constructor成立,通常意味着__proto__也相等(因为constructor默认存在于prototype上) - 但仅靠
constructor相等不能保证__proto__相等(例如人为设置objB.constructor = objA.constructor,但没改__proto__) - 所以核心依据仍是
__proto__或Object.getPrototypeOf()


















