javascript函数因既是对象又是构造函数而成为原型链枢纽:其__proto__指向function.prototype,后者__proto__指向object.prototype;函数的prototype属性为new实例指定原型起点,所有内置构造函数原型链均在object.prototype交汇。

JavaScript 函数在原型链查找中并不具备“特殊地位”,但它因**既是对象又是构造函数**,天然处于原型链的关键连接点上——这种双重身份让它在链的构建和属性查找中扮演枢纽角色,而非规则例外。
函数是对象,所以有 __proto__
所有函数都是 Function 的实例,因此:
- 函数对象自身拥有
__proto__,指向Function.prototype -
Function.prototype.__proto__指向Object.prototype,最终以null终止 - 这意味着调用
myFunc.toString()会沿链查找:myFunc → Function.prototype → Object.prototype → null
函数有 prototype 属性,决定实例的原型起点
只有函数(且非箭头函数)才有 prototype 属性,这个属性不是用来被自己查找的,而是为将来用 new 创建的实例指定原型:
-
function Foo() {}创建后,Foo.prototype自动成为一个普通对象 -
const f = new Foo()→f.__proto__ === Foo.prototype - 这个
Foo.prototype对象本身也有__proto__,通常指向Object.prototype
Function 和 Object 的原型链交汇于顶层
所有内置构造函数(Array、Date、RegExp 等)以及自定义函数,其 prototype 对象都继承自 Object.prototype:
Array.prototype.__proto__ === Object.prototypeFunction.prototype.__proto__ === Object.prototype- 所以
Array、Function、Object三者原型链在Object.prototype汇合,再向上即为null
没有“跳过函数”的查找规则
引擎不会因为某个环节是函数就改变查找逻辑。属性查找始终严格遵循:自有属性 → __proto__ → __proto__.__proto__ → … → null:
-
console.log是console对象的自有属性,不走原型链 -
[].push在Array.prototype.push上,不经过Function.prototype - 即使你写
function F(){}; F.x = 1;,访问F.x是直接读函数自身的属性,不是查它的prototype
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











