
本文解析函数对象的 __proto__ 实际指向 Function.prototype(本身是函数对象)的原因,阐明其在原型链中的位置、非枚举性特征及与 Object.keys() 不可见性的关系。
本文解析函数对象的 `__proto__` 实际指向 `function.prototype`(本身是函数对象)的原因,阐明其在原型链中的位置、非枚举性特征及与 `object.keys()` 不可见性的关系。
在 JavaScript 中,所有函数都是 Function 构造函数的实例,因此它们的隐式原型(即 __proto__)必然指向 Function.prototype。以如下代码为例:
function objectFunction() {
this.x = 2;
}
console.log(objectFunction.__proto__); // → ƒ () { [native code] }
console.log(objectFunction.__proto__ === Function.prototype); // → true
console.log(Object.keys(objectFunction)); // → []尽管 objectFunction 是一个函数,Object.keys() 返回空数组,说明其自身可枚举属性为空;但 __proto__ 并非它自身的自有属性,而是继承自 Object.prototype 的非枚举 getter。该 getter 定义在 Object.prototype 上(规范中明确要求所有普通对象都可通过 __proto__ 访问其内部 [[Prototype]]),因此即使 objectFunction 自身没有显式定义 __proto__,也能通过原型链访问到它。
其完整原型链为:
objectFunction → Function.prototype → Object.prototype → null
关键点在于:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- objectFunction.__proto__ 实际返回的是 Function.prototype;
- 而 Function.prototype 本身是一个函数对象(其 typeof 为 'function'),这是 ECMAScript 规范为向后兼容所作的设计(见 ECMA-262 §20.2.3);
- Function.prototype 的 call、apply、bind 等方法均挂载于此,因此它必须具备函数行为(如可被调用),这也是它表现为“函数”的根本原因。
⚠️ 注意事项:
- __proto__ 是非标准(虽被广泛支持)且已不推荐使用的属性,应优先使用 Object.getPrototypeOf(obj) 获取原型;
- prototype 属性仅存在于函数对象上,用于构造实例时的原型委托;而 __proto__(或 getPrototypeOf)反映的是当前对象的实际原型,二者作用域和用途截然不同;
- Object.keys()、for...in 等仅遍历可枚举自有属性,无法访问 __proto__ 这类继承来的非枚举 accessor 属性。
总结:objectFunction.__proto__ 返回函数,并非异常,而是 JavaScript 原型机制与规范设计共同作用的结果——它精准指向 Function.prototype,而该对象被规范定义为函数类型,以保障语言一致性与历史兼容性。

















