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反直觉,本质是混淆了两个完全不同的概念:
Object本身:它是一个内置构造函数,类型是function,和你自己写的fn没有本质区别,都是Function构造器创建出来的实例。既然是Function的实例,它的[[Prototype]]自然指向Function.prototype,和自定义函数的规则完全一致。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.prototypeObject.prototype的[[Prototype]]→null,是原型链的终点
内容的提问来源于stack exchange,提问作者recmach
相关产品推荐
相关产品推荐

