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

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

本文通过代码实证分析 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 相关产品和应用

全部下载

专题列表