判断两个对象是否共享同一原型,关键在于它们的内部[[Prototype]]引用是否指向同一内存地址,最标准方式是Object.getPrototypeOf(obj1) === Object.getPrototypeOf(obj2);该方法直接比较原型对象本身,不依赖constructor、__proto__或instanceof,适用于所有对象且结果精确可靠。

判断两个对象是否共享同一原型,关键不是看它们“像不像”,而是看它们的内部 [[Prototype]] 引用是否指向同一个对象。这和属性值相等、构造函数相同、甚至 instanceof 结果一致都不同——它要求原型对象本身是同一个内存地址。
用 Object.getPrototypeOf() 严格比对
这是最标准、最可靠的方式:获取两个对象各自的原型,再用 === 判断是否为同一对象。
Object.getPrototypeOf(obj1) === Object.getPrototypeOf(obj2)- 返回
true表示它们直接继承自同一个原型对象(不是原型链中某一层相同,而是“亲爹”一样) - 适用于所有对象,无论是否由构造函数创建,也无需依赖
constructor或prototype属性
为什么不用 instanceof?
instanceof 检查的是整个原型链中是否包含某个构造函数的 prototype,它不关心“直接原型”是否相同。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 例如:
const a = {}; const b = {}; console.log(a instanceof Object && b instanceof Object)都是true,但a和b的直接原型虽然都是Object.prototype,这个结果不能反推二者原型相同——得靠getPrototypeOf确认 - 如果原型链被手动修改(如用
Object.setPrototypeOf),instanceof可能失效或给出误导性结果
为什么避免用 __proto__ 或 constructor?
__proto__ 是非标准属性,已被 Object.getPrototypeOf() 取代;而 constructor 属性容易被覆盖或丢失,完全不可信。
立即学习“Java免费学习笔记(深入)”;
-
obj1.constructor === obj2.constructor只说明它们可能由同一函数构造,不代表原型相同(比如有人改写了Child.prototype.constructor = Parent) -
obj.__proto__ === otherObj.__proto__虽然在部分环境能工作,但语义模糊、兼容性差,且可能因代理、冻结等操作失效
实际场景举例
适合用于需要精确类型控制或行为一致性的地方:
- 自定义类的实例是否属于同一“版本”的原型(比如热更新后重新定义了
MyClass.prototype,旧实例和新实例的原型就不同) - 序列化还原时验证对象是否应具备某组方法(只认原型对象本身,不接受子类或混入)
- 实现轻量级“原型守卫”:比如
if (Object.getPrototypeOf(data) === CacheItem.prototype),确保只处理预期结构的对象

















