object.getprototypeof 是 javascript 中安全获取对象直接原型的标准方法,返回其内部 [[prototype]],严格单步向上遍历,适用于继承调试、行为追溯与原型链完整遍历。

Object.getPrototypeOf 是 JavaScript 中用于安全获取对象直接原型的原生方法,它在继承链中精准定位上一级原型,避免了 __proto__ 的非标准性和潜在副作用,是现代继承调试与行为追溯的推荐方式。
明确作用:只取直接父级原型,不跳过中间层
该方法返回指定对象的内部 [[Prototype]](即其 constructor.prototype),严格遵循原型链单步向上规则。它不会跳过代理、冻结对象或特殊内置对象的原型边界,也不会因属性遮蔽而误判。
- 对普通对象,返回创建它的构造函数的
prototype - 对通过
Object.create(null)创建的对象,返回null - 对数组、日期等内置实例,返回对应内置构造器的原型(如
Array.prototype)
安全追溯:配合 while 循环遍历完整原型链
单独调用一次只能拿到一级原型,要完整追溯行为来源,需结合循环和终止条件。关键在于用 Object.getPrototypeOf(obj) !== null 判断是否到达链顶,而非依赖 obj.__proto__ 或 constructor 属性——后者可能被篡改或缺失。
- 始终用
Object.getPrototypeOf(obj)替代obj.__proto__ - 每次迭代前检查返回值是否为
null,防止无限循环 - 若需比对特定原型(如确认是否继承自
EventTarget),用===直接比较引用
识别行为归属:区分定义位置与实际调用路径
原型链上的方法调用看似“属于”当前实例,实则由原型提供。使用 Object.getPrototypeOf 可逐层检查各原型是否拥有目标方法,从而定位行为真实定义处。
- 例如:
arr.push()行为定义在Array.prototype,而非arr自身 - 用
Object.getPrototypeOf(arr).hasOwnProperty('push')可验证 - 对自定义类,可沿链检查
Object.getPrototypeOf(instance).constructor.name确认所属类
规避常见陷阱:null 原型、代理与不可扩展对象
某些对象(如 Object.create(null) 实例、Proxy 包裹对象、被 Object.preventExtensions() 锁定的对象)会影响原型访问逻辑,需提前判断。
- 对
null原型对象,首次调用即返回null,循环应立即退出 - Proxy 默认不拦截
getPrototypeOf,但若 handler 显式定义了getPrototypeOftrap,则按 trap 返回值处理 - 不可扩展对象不影响
Object.getPrototypeOf的读取能力,仅限制新增原型属性











