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
相关产品推荐
相关产品推荐

