object.getprototypeof用于获取对象的[[prototype]],只接受对象类型参数,返回其原型对象,不等于构造函数的prototype属性,常用于验证es6类的继承关系。

Object.getPrototypeOf 是获取对象内部 [[Prototype]](即隐式原型)的标准方法,它返回该对象的原型对象,也就是其 __proto__ 指向的那个对象。正确使用的关键在于理解它只读、不操作、不处理 null/undefined,并且与构造函数的 prototype 属性有明确区分。
只用于普通对象,不能传入原始值
该方法要求参数必须是对象(包括数组、函数、日期等引用类型),传入字符串、数字、布尔值、null 或 undefined 会直接抛出 TypeError。
- ✅ 正确:
Object.getPrototypeOf({})、Object.getPrototypeOf([])、Object.getPrototypeOf(new Date()) - ❌ 报错:
Object.getPrototypeOf("hello")、Object.getPrototypeOf(42)、Object.getPrototypeOf(null) - ⚠️ 注意:包装对象(如
new String("a"))是对象,可以传入,但一般不推荐这样用
返回的是原型对象,不是构造函数的 prototype 属性
初学者容易混淆 Object.getPrototypeOf(obj) 和 Constructor.prototype。前者是实例的原型链上一级,后者是构造函数身上的一个属性。二者在“默认情况下”相等,但可被修改。
- 例如:
const obj = {};→Object.getPrototypeOf(obj) === Object.prototype为 true - 但如果执行了
obj.__proto__ = null,再调用Object.getPrototypeOf(obj)就返回null,而Object.prototype仍是原对象 - 所以不要假设
Object.getPrototypeOf(obj) === obj.constructor.prototype,因为constructor可能被改写,__proto__也可能被显式设置
配合 Object.setPrototypeOf 使用时需谨慎
Object.getPrototypeOf 常和 Object.setPrototypeOf 配合做原型链检查或临时替换,但要注意:
-
Object.setPrototypeOf性能较差,现代代码应优先用Object.create(proto)创建指定原型的对象 - 若需判断某对象是否继承自某个原型,推荐用
obj instanceof Constructor或proto.isPrototypeOf(obj),比反复调用getPrototypeOf更清晰 - 避免在循环中高频调用它——虽然本身很快,但可能掩盖原型链设计问题
在类和继承场景中验证原型链
ES6 class 实际也是基于原型的语法糖,Object.getPrototypeOf 可直观查看继承关系:
-
class A {},class B extends A {},const b = new B() -
Object.getPrototypeOf(b) === B.prototype✔️ -
Object.getPrototypeOf(B.prototype) === A.prototype✔️ -
Object.getPrototypeOf(A.prototype) === Object.prototype✔️ - 这样就能逐级确认原型链是否符合预期











