news 2026/8/3 21:01:14

深入理解 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/7/28 4:58:53

iOS核心开发手册【1.1】

1.3 解决方案:添加拖动手势识别器用手势识别器也可以实现与解决方案1-1相同的交互功能,而且还不用直接编写触摸处理程序[1]。拖动手势识别器可以侦测拖曳手势。只要iOS系统检测到拖动手势,它就会触发你所指定的回调方法。解决方案1-2的代码与…

作者头像 李华
网站建设 2026/8/2 17:41:28

开源模型也能商业变现:基于TensorRT的推理API开发指南

开源模型也能商业变现:基于TensorRT的推理API开发指南 在AI应用从实验室走向生产线的过程中,一个常见的困境是:我们手握开源社区中训练得近乎完美的模型——比如YOLOv5、ResNet或BERT——但一旦部署到线上服务,却发现延迟高、吞吐…

作者头像 李华
网站建设 2026/7/28 14:19:20

模拟信号电平转换电路:新手入门必看

模拟信号电平转换实战指南:从零开始搞懂接口设计你有没有遇到过这样的情况?手里的传感器输出是5V,但主控芯片的ADC只能接受3.3V——直接连上去,轻则读数不准,重则烧毁引脚。又或者,采集音频信号时发现波形被…

作者头像 李华
网站建设 2026/7/28 6:50:34

NVIDIA官方TensorRT镜像深度解析:GPU算力优化的秘密武器

NVIDIA官方TensorRT镜像深度解析:GPU算力优化的秘密武器 在AI模型从实验室走向真实世界的过程中,一个看似不起眼却极为关键的环节常常被低估——推理部署。训练完成的模型如果跑得不够快、资源消耗太大,再先进的算法也难以落地。尤其是在视频…

作者头像 李华
网站建设 2026/7/30 21:54:24

高并发场景下的救星:TensorRT优化的大模型推理Pipeline

高并发场景下的救星:TensorRT优化的大模型推理Pipeline 在电商大促的深夜,推荐系统突然迎来百万级用户同时点击;语音助手在会议室里被十几人轮番唤醒;自动驾驶车辆在复杂城市环境中每秒处理数百帧感知数据——这些真实世界的高并…

作者头像 李华