深入理解 JavaScript 原型链:Function 与 Object 的终极关系

咖啡半糖
咖啡半糖
发布时间:2026-10-15| 6人浏览过
原创

本文通过代码实证分析 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 原型链的两个不同走向:

  1. 对象溯源(实例 → 构造函数):
    任意实例对象的 __proto__ 指向其构造函数。
    构造函数的 __proto__ 指向 Function.prototype。
    终点:Function
  2. 原型溯源(函数原型 → 基础对象):
    任何函数(包括内置函数)的 prototype 对象,其 __proto__ 指向 Object.prototype。
    终点:Object / null

这种设计确保了两个层面的统一:一方面,所有函数对象共享同一套函数行为(来自 Function.prototype);另一方面,所有对象的数据行为(如 toString、hasOwnProperty)最终都汇聚到 Object.prototype。

图解形象化理解

为了方便记忆,可以将 Function 视为创造万物的“上帝”或“工厂”。它创造了各种类型的对象(人、动物、数据等)。这些对象拥有共同的底层属性(来自 Object/物质基础),同时也拥有各自类的特有方法。

通过以上梳理,原型链的逻辑不再是晦涩的规则堆砌,而是一个严密的层级体系。掌握 __proto__ 与 prototype 的区别及其交汇点,是深入理解 JavaScript 面向对象编程的关键。

以上就是深入理解 JavaScript 原型链:Function 与 Object 的终极关系的详细内容,更多关于 JavaScript 原型链函数对象的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。