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

JavaScript中Object.__proto__返回原生函数 是否所有JS内容均为函数?

JavaScript 原型链相关现象解答

首先明确核心前提:JavaScript 采用基于原型的继承机制,所有对象都持有一个内部的[[Prototype]]指针(在Chrome中暴露为可访问的__proto__属性),顺着这个指针向上查找的路径就是原型链,链路的终点固定为null。

三个观察到的现象解释

1. 访问Object.__proto__返回原生函数的含义

  • Object本身是JavaScript内置的构造函数,属于函数对象类别。所有函数对象的__proto__,都会指向它的构造器Function的原型对象,也就是Function.prototype。
  • 你看到的ƒ () { [native code] }就是Function.prototype的浏览器输出形式:这个对象是引擎原生实现的,本身属于函数类型,所以不会显示普通对象的格式,符合Chrome的原生函数打印规则。

2. 访问Function.__proto__.__proto__.__proto__返回null

把这条访问链拆成三步逐段拆解就能理清楚:

  • 第一层:Function.__proto__
    和所有普通函数的规则一致,Function本身作为函数对象,它的__proto__同样指向Function.prototype,也就是上文中提到的那个原生函数对象。
  • 第二层:Function.__proto__.__proto__
    也就是Function.prototype.__proto__。Function.prototype虽然是函数类型,但它本质上也是一个对象,对象的默认__proto__会指向它的构造器(也就是Object)的原型对象,即Object.prototype。
  • 第三层:Function.__proto__.__proto__.__proto__
    也就是Object.prototype.__proto__。按照JavaScript的语言规范,Object.prototype是原型链的顶层节点,它的__proto__被固定设置为null,代表这里是链路的尽头,没有更上层的原型可以查找,所以最终返回null。

3. 执行typeof Object结果为Function

这里的核心是区分“函数类型”的判定规则:只要一个值可以被调用(支持直接执行、或者配合new关键字构造实例),typeof操作符就会将其判定为'function'。

  • Object既可以直接当作构造函数执行(比如new Object()创建普通对象),本身还挂载了Object.keys()、Object.assign()这类静态方法,完全满足函数类型的判定条件,所以输出结果是'function',而不是普通对象类型。

对“难道JavaScript中所有内容都是函数”的澄清

这个判断不成立,函数只是JavaScript中多种值类型里的一种。你产生错觉的原因是日常接触到的Object、Array、Promise这类全局内置标识符本身是构造函数,不代表JS里所有值都是函数。
可以用几个简单的例子验证:

  • 数值类型:typeof 123返回'number'
  • 字符串类型:typeof 'hello'返回'string'
  • 布尔类型:typeof true返回'boolean'
  • 普通对象:typeof { a: 1 }返回'object'
  • 数组类型:typeof [1,2,3]返回'object'
    补充说明:函数是一种特殊的可调用对象,它既可以像普通对象一样存储自定义属性,也支持被执行调用,但普通对象不具备可调用的特性,强行把普通对象当函数执行会直接抛出类型错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 05:45:04