object.getprototypeof 是只读原型查询工具,用于获取对象的[[prototype]]:函数对象查得function.prototype,实例查得构造函数的prototype,class继承中子类函数原型指向父类函数,支撑静态方法继承与原型链调试。

Object.getPrototypeOf 本身不是用来“在函数调用中发挥作用”的工具,它不参与函数执行流程(比如不触发 call/apply、不改变 this、不拦截调用),而是一个**只读的原型查询工具**——它的作用是告诉你:某个对象(包括函数对象)的内部 [[Prototype]] 指向谁。但它在函数相关场景中非常关键,尤其涉及构造器、类继承和方法查找时。
查函数对象自身的原型(即函数的 __proto__)
函数也是对象,所以它有原型。调用 Object.getPrototypeOf(F) 返回的是该函数对象的直接原型,也就是它从哪“继承”来的属性(比如 call、bind、toString 等):
-
Object.getPrototypeOf(function(){}) === Function.prototype→ true -
Object.getPrototypeOf(class{}) === Function.prototype→ true(class 是函数语法糖) -
Object.getPrototypeOf(Date) === Function.prototype→ true
这说明所有普通函数(含 class)都直接继承自 Function.prototype,因此能用 call、length 等内置属性。
查函数实例的原型(即 new 出来的对象的原型链起点)
当你用 new F() 创建实例时,该实例的 [[Prototype]] 默认指向 F.prototype。这时 Object.getPrototypeOf(instance) 就等于 F.prototype:
function Foo() {}const f = new Foo();-
Object.getPrototypeOf(f) === Foo.prototype→ true
这是实现原型继承的基础:实例通过这条链接访问构造函数原型上的方法。
在 class 继承中识别静态继承关系
ES6 class 的 extends 会同时建立两层原型关联:
一是实例 → 子类原型 → 父类原型;
二是子类函数自身 → 父类函数。
-
class Parent {}class Child extends Parent {} -
Object.getPrototypeOf(Child) === Parent→ true
这个结果意味着:子类可以继承父类的静态方法(如 Parent.staticMethod() 可被 Child.staticMethod() 调用),因为 Child 的 [[Prototype]] 链通向 Parent。
安全访问父类方法(避免硬编码依赖)
在子类方法中,可以用 Object.getPrototypeOf(this) 获取当前实例的直接原型,进而调用父类同名方法(常配合 call 使用):
-
class Child extends Parent {method() {return Object.getPrototypeOf(Object.getPrototypeOf(this)).method.call(this);}}
注意:更推荐用 super.method(),但理解 Object.getPrototypeOf 的路径有助于调试原型链断裂问题。
它不改变运行时行为,也不参与调用栈,但能帮你看清“为什么这个函数能调用那个方法”——本质是原型链上的属性查找在起作用。











