object.getprototypeof是获取对象直接原型的标准方法,返回其内部[[prototype]]指向的对象;它不遍历原型链,结果精确可靠,且优于非标准的__proto__和易被篡改的constructor.prototype。

Object.getPrototypeOf 是获取对象直接原型的标准方法,它返回指定对象内部 [[Prototype]] 指向的原型对象(即 __proto__ 所指向的对象),不涉及原型链遍历,因此结果精确、可靠。
明确“直接原型”的含义
JavaScript 中每个对象都有一个内部属性 [[Prototype]],它只指向**创建该对象时所用构造函数的 prototype 对象**(或通过 Object.create() 显式指定的原型)。这个链接是单层的,不是整个原型链。
例如:
-
const obj = {}→ 直接原型是Object.prototype -
const arr = []→ 直接原型是Array.prototype -
class B extends A {}; const b = new B()→b的直接原型是B.prototype,不是A.prototype
正确使用 Object.getPrototypeOf
调用方式简单直接:Object.getPrototypeOf(obj)。它严格返回 obj 内部 [[Prototype]] 的值,不会向上查找。
- ✅ 正确:
Object.getPrototypeOf(new Date()) === Date.prototype→true - ✅ 正确:
Object.getPrototypeOf(Object.create(null)) === null→true(无原型) - ❌ 错误:把它当作
instanceof或isPrototypeOf使用——它不判断继承关系,只读取当前一层链接
与 __proto__ 和 constructor.prototype 的区别
__proto__ 是非标准但广泛支持的访问器,行为等价于 Object.getPrototypeOf,但推荐使用后者,更规范、更安全(__proto__ 在严格模式下可能受限,且易被污染)。obj.constructor.prototype 则不一定等于直接原型:
- 如果
constructor被修改过(如重写了B.prototype.constructor = A),结果就错 - 对于用
Object.create(null)创建的对象,constructor不存在,访问会报错 -
Object.getPrototypeOf始终基于内部[[Prototype]],不受属性干扰
实用场景举例
常用于类型识别、原型级方法劫持、深克隆判断是否为原生对象等:
- 判断是否为纯对象(非 Array、Date、RegExp 等):
Object.getPrototypeOf(obj) === Object.prototype - 安全地调用原型方法:
Object.getPrototypeOf(obj).toString.call(obj)(避免 obj 自身重写 toString) - 在代理或装饰器中保留原始原型链:
Object.setPrototypeOf(wrapper, Object.getPrototypeOf(target))










