You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Object.getPrototypeOf(Object)为何等于Function.prototype

Object.getPrototypeOf(Object) === Function.prototype原理解释

首先明确两个核心规则,所有代码表现都围绕规则展开,没有例外:

  • Object.getPrototypeOf(参数)永远返回参数对象内部[[Prototype]]隐藏属性指向的值,也就是该对象的直接原型
  • JavaScript中所有函数本质都是Function构造器的实例,不管是开发者自定义的普通函数,还是语言内置的Object/Array/Date这类原生构造函数,本质上都是通过new Function()创建的函数对象。

已知示例的逻辑复盘

第一个示例是手动指定原型的基础场景,逻辑非常直接:

const prototype1 = {};
const object1 = Object.create(prototype1);
console.log(Object.getPrototypeOf(object1) === prototype1); // 输出 true

Object.create会直接把传入的参数设为新对象的[[Prototype]],所以结果符合预期。

第二个示例是自定义函数的原型指向,符合常规认知:

function fn() {
}
Object.getPrototypeOf(fn) == Function.prototype // 输出 true

自定义函数fn是Function的实例,所以它的[[Prototype]]指向Function.prototype。

疑惑点的核心解释

觉得Object.getPrototypeOf(Object) == Function.prototype反直觉,本质是混淆了两个完全不同的概念:

  1. Object本身:它是一个内置构造函数,类型是function,和你自己写的fn没有本质区别,都是Function构造器创建出来的实例。既然是Function的实例,它的[[Prototype]]自然指向Function.prototype,和自定义函数的规则完全一致。
  2. Object.prototype:这是Object构造函数的prototype属性,作用是给new Object()创建出来的普通对象当原型用,它本身是一个普通对象类型,是绝大多数对象原型链的顶端,它的[[Prototype]]为null。

可以跑几行简单的代码验证这个逻辑:

console.log(typeof Object); // 输出 'function',直接证明Object本身是函数对象
console.log(Object.getPrototypeOf(Array) === Function.prototype); // 输出true,Array也是内置构造函数,规则一致
console.log(Object.getPrototypeOf(Function) === Function.prototype); // 输出true,Function作为构造函数本身也是自己的实例

常见认知误区

很多人会误以为构造函数自己的原型就是它的prototype属性,这是完全错误的:

  • 构造函数的prototype属性,是给它new出来的实例对象当原型用的,和构造函数自身的原型没有关系
  • 比如自定义的fn函数,fn.prototype是给new fn()生成的对象当原型的,fn自己作为函数实例,原型还是Function.prototype,这个规则套在Object身上完全成立。

这部分的原型链关系梳理如下:

  • 所有函数(自定义函数、内置构造函数)的[[Prototype]] → Function.prototype
  • Function.prototype是普通对象类型,它的[[Prototype]] → Object.prototype
  • Object.prototype的[[Prototype]] → null,是原型链的终点

内容的提问来源于stack exchange,提问作者recmach

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 16:24:29