深入理解 JavaScript 原型链:Function 与 Object 的终极关系
本文通过代码实证分析 JavaScript 原型链中对象与构造函数的关系,揭示 __proto__、prototype 及 Object/Function 之间的层级结构,帮助开发者理清原型继承的核心机制。
基本规则:隐式原型与显式原型的对应
在 JavaScript 中,所有对象都拥有一个隐式原型 __proto__(现代开发中更推荐使用 Object.getPrototypeOf())。最核心的法则可以概括为:
一个普通对象的隐式原型(__proto__),等于构造该对象的构造函数的显式原型(prototype)。
这一规则适用于大多数内置类型和自定义构造函数。例如:
const str = new String("123");
str.__proto__ === String.prototype; // true
const arr = ["123"];
arr.__proto__ === Array.prototype; // true
const obj = {};
obj.__proto__ === Object.prototype; // true
const fn = function(){};
fn.__proto__ === Function.prototype; // true
无论采用字面量还是构造函数方式声明,只要确定了对象的创建源头,上述等式均成立。
向上追溯:函数也是对象
既然函数也是对象,那么用 __proto__ 继续向上寻找构造函数的“父级”会如何呢?让我们检查几个常用的构造函数:
String.__proto__ === Function.prototype; // true
Array.__proto__ === Function.prototype; // true
Boolean.__proto__ === Function.prototype; // true
Object.__proto__ === Function.prototype; // true
Function.__proto__ === Function.prototype; // true
这里出现了一个关键现象:**所有的内置构造函数(包括 Function 自身),都是由 Function 构造出来的。** 因此,它们的一级原型链都指向了 Function.prototype。
当我们再次尝试对 Function.__proto__ 进行查询时:
Function.__proto__ === Function.prototype; // true
这构成了一个自指闭环,无法继续向上一层的“函数之父”追溯。但如果我们换一条路径,查看**构造函数的原型属性**(prototype)的原型链,情况则完全不同。
奇点解析:Function.prototype 的去向
虽然构造函数本身由 Function 生成,但它们的 prototype 属性(即实例的原型来源)却有着另一层归属。我们来看看 Function.prototype 这个特殊的对象指向哪里:
Function.prototype.__proto__ === Object.prototype; // true
String.prototype.__proto__ === Object.prototype; // true
Array.prototype.__proto__ === Object.prototype; // true
Object.prototype.__proto__ === Object.prototype; // true
这是一个至关重要的结论:所有构造函数的 prototype 属性,本质上都是对象,因此它们的原型指向了 Object.prototype。
原型链的完整拓扑结构
结合上述两点,我们可以清晰地描绘出 JavaScript 原型链的两个不同走向:
- 对象溯源(实例 → 构造函数):
任意实例对象的__proto__指向其构造函数。
构造函数的__proto__指向Function.prototype。
终点:Function - 原型溯源(函数原型 → 基础对象):
任何函数(包括内置函数)的prototype对象,其__proto__指向Object.prototype。
终点:Object / null
这种设计确保了两个层面的统一:一方面,所有函数对象共享同一套函数行为(来自 Function.prototype);另一方面,所有对象的数据行为(如 toString、hasOwnProperty)最终都汇聚到 Object.prototype。
图解形象化理解
为了方便记忆,可以将 Function 视为创造万物的“上帝”或“工厂”。它创造了各种类型的对象(人、动物、数据等)。这些对象拥有共同的底层属性(来自 Object/物质基础),同时也拥有各自类的特有方法。
通过以上梳理,原型链的逻辑不再是晦涩的规则堆砌,而是一个严密的层级体系。掌握 __proto__ 与 prototype 的区别及其交汇点,是深入理解 JavaScript 面向对象编程的关键。
以上就是深入理解 JavaScript 原型链:Function 与 Object 的终极关系的详细内容,更多关于 JavaScript 原型链函数对象的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









