news 2026/4/15 12:20:24

深入理解 JavaScript 原型系统:__proto__、prototype 与原型链之间的关系解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入理解 JavaScript 原型系统:__proto__、prototype 与原型链之间的关系解析

标签:JavaScript、原型、原型链、__proto__prototype、前端基础、面试必备

在 JavaScript 中,“一切皆对象”是一句耳熟能详的话。但真正理解这句话背后机制的人却不多。
为什么对象能调用toString()
为什么数组有push()方法?
为什么 objinstanceof Array能判断类型?

答案都指向同一个核心机制:原型(Prototype)与原型链(Prototype Chain)

本文将带你从零开始,彻底搞懂:

  • prototype是什么?
  • __proto__又是什么?
  • 它们之间有何关系?
  • 原型链如何工作?
  • 以及常见的误区与最佳实践。

一、基本概念:prototypevs__proto__

每个 JavaScript 对象(除了null)内部都有一个隐式链接,指向另一个对象 —— 这个被指向的对象就是它的原型

这个隐式链接在规范中叫[[Prototype]],在代码中可通过以下方式访问:

  • 非标准但广泛支持:obj.__proto__
  • 标准方式:Object.getPrototypeOf(obj)

这是最容易混淆的两个属性,但它们的归属和作用完全不同:

属性所属类型作用
prototype函数(Function)对象用于构造函数创建实例时,实例的__proto__会指向它
__proto__所有对象(包括函数)对象指向该对象的原型(即内部[[Prototype]]),用于属性查找

✅ 简单记:

  • 只有函数才有prototype
  • 所有对象都有__proto__

二、一个例子看懂关系

function Person(name) { this.name = name; } Person.prototype.sayHello = function() { console.log(`Hello, I'm ${this.name}`); }; const alice = new Person('Alice');

此时的关系如下:

  • alice.__proto__ === Person.prototype→ ✅ true
  • Person.prototype.constructor === Person→ ✅ true
  • Person.__proto__ === Function.prototype→ ✅ true(因为Person是函数)

💡new Person()创建的对象,其__proto__自动指向Person.prototype


三、原型链(Prototype Chain)是如何工作的?

当你访问一个对象的属性时,JavaScript 引擎会按以下顺序查找:

  1. 在对象自身查找;
  2. 如果没找到,沿着__proto__向上查找;
  3. 重复此过程,直到Object.prototype
  4. 若仍未找到,返回undefined

示例:

const obj = {}; console.log(obj.toString()); // " [object Object] " // 查找路径: // obj → obj.__proto__ (=== Object.prototype) → 找到 toString

Object.prototype__proto__null,表示原型链终结:

Object.prototype.__proto__ === null; // true

四、ObjectFunction的特殊关系(原型系统的基石)

JavaScript 的整个原型体系建立在两个内置对象之上:ObjectFunction

关键关系:

// 1. Object 和 Function 都是函数 typeof Object; // "function" typeof Function; // "function" // 2. 它们都是 Function 的实例 Object instanceof Function; // true Function instanceof Function; // true // 3. __proto__ 指向 Object.__proto__ === Function.prototype; // true Function.__proto__ === Function.prototype; // true // 4. Function.prototype 是普通对象 Function.prototype.__proto__ === Object.prototype; // true // 5. Object.prototype 是原型链顶端 Object.prototype.__proto__ === null; // true

原型关系图(文字版):

Function ──.__proto__──→ Function.prototype ──.__proto__──→ Object.prototype ──.__proto__──→ null ↑ │ (instanceof) Object ──.__proto__───────────────────────────────────────┘

🔁 这看似“循环”,实则是 JS 引擎初始化时预设的闭环结构。


五、__proto__是标准吗?推荐用法是什么?

虽然obj.__proto__在所有现代浏览器中都支持,但它不是 ECMAScript 标准的一部分(仅在附录 B 作为遗留特性保留)。

✅ 推荐使用标准 API:

操作推荐写法说明
获取原型Object.getPrototypeOf(obj)标准、安全
设置原型Object.setPrototypeOf(obj, proto)谨慎使用(性能差)
创建指定原型的对象Object.create(proto)高效、常用

❌ 不推荐:

obj.__proto__ = SomePrototype; // 非标准,破坏引擎优化

六、常见误区与面试题

1.typeof null为什么是"object"

这是 JavaScript 初期的一个历史性 bug(因底层类型标签用 3 位表示,null的机器码为 000,被误判为对象),但为了兼容性一直保留至今。

2. 为什么[] instanceof Objecttrue

因为数组的原型链:
[] → Array.prototype → Object.prototype
所以[]也是Object的实例。

3. 修改prototype会影响已创建的实例吗?

会!因为实例通过__proto__引用原型对象,不是拷贝。

function Foo() {} const a = new Foo(); Foo.prototype.newMethod = () => 'hi'; console.log(a.newMethod()); // "hi" ✅

七、总结:一张表理清核心概念

概念说明
prototype函数独有的属性,用于 new 创建的对象继承
__proto__所有对象都有,指向其原型(即[[Prototype]]
原型链属性查找机制:沿__proto__向上直到null
Object.prototype原型链的终点之一,提供toStringhasOwnProperty等方法
Function所有函数的构造器,包括ObjectArray
最佳实践Object.create()Object.getPrototypeOf(),避免直接操作__proto__

延伸阅读

  • MDN: 继承与原型链
  • ECMAScript 规范:[[Prototype]][[Call]]内部方法
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 12:19:54

在潘多拉圣树下烤串:论AI“片场探班”如何在科幻迷头上拉屎

《在潘多拉圣树下烤串:论AI“片场探班”如何在科幻迷头上拉屎》 近来忽见一种“新式供奉”盛行于短视频之野:有人以五十元成本、几句“提示词”,便将自己送入《阿凡达3》片场,与奈蒂莉执手自拍,同卡梅隆谈笑风生&…

作者头像 李华
网站建设 2026/4/15 12:19:49

hbuilderx下载项目应用:学生如何高效搭建前端环境

学生如何用HBuilderX高效搭建前端开发环境?从下载到实战一步到位 你是不是也经历过这样的场景:刚上完一节前端课,老师布置了“做一个个人主页”的作业,结果还没开始写代码,就在安装工具这一步卡住了? Nod…

作者头像 李华
网站建设 2026/4/15 12:19:48

基于遗传算法优化BP神经网络的时间序列预测探索

基于遗传算法(GA)优化的BP神经网络的时间序列预测 遗传算法工具箱为goat(北卡罗来纳大学) 单隐含层 基于MATLAB环境在数据驱动的时代,时间序列预测是众多领域如金融、气象、工业生产等中至关重要的任务。今天咱们就来唠唠基于遗传算法(GA&…

作者头像 李华
网站建设 2026/4/15 12:19:54

ECS系统入门手记——其二

前言 还是因为期末考试导致ECS系统的学习推迟了很久,再加上ECS的内容比较抽象,这里只是简单讲讲进阶内容 原型和chunk 在笔记一中我们介绍了chunk,我们知道IJobEntity是它的语法糖,现在,让我们正式和它见一面吧。 简单…

作者头像 李华
网站建设 2026/4/10 23:26:55

如何监控和优化TensorRT推理服务的QPS与P99延迟?

如何监控和优化TensorRT推理服务的QPS与P99延迟? 在AI模型加速落地的今天,一个训练得再精准的深度学习模型,如果在线上推理时响应缓慢、吞吐不足,依然无法支撑真实的业务场景。尤其在推荐系统、视频分析、自动驾驶等对实时性要求极…

作者头像 李华
网站建设 2026/4/14 23:09:14

复习编译原理的LR(0)

一、题目考查的知识点总结这道题主要考查 LR 分析法的相关概念,具体包括:LR(0) 项目什么是项目(Item)?一个产生式加上一个“点”,表示分析到该产生式的哪个位置。例如 A → αβ 表示已经识别出 α&#xf…

作者头像 李华