news 2026/4/23 9:26:15

HoRain云--深入解析JavaScript原型链机制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HoRain云--深入解析JavaScript原型链机制

🎬 HoRain云小助手:个人主页

🔥 个人专栏: 《Linux 系列教程》《c语言教程》

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

⚙️ 原型与原型链的工作原理

🔑 关键属性与方法的区别

🧩 基于原型的继承模式

💡 最佳实践与常见问题

💎 总结


JavaScript 的prototype是理解该语言面向对象编程继承机制的核心概念。它允许对象从其他对象继承属性和方法,从而实现代码复用和共享。下面我将系统地介绍其工作机制、关键属性和实际应用。

⚙️ 原型与原型链的工作原理

每个 JavaScript 函数(除箭头函数外)在创建时都会自动获得一个prototype属性,该属性是一个对象,称为原型对象。当使用new关键字通过构造函数创建实例时,该实例的内部指针(通常通过__proto__访问)会指向构造函数的prototype对象。

当你访问一个对象的属性或方法时,JavaScript 引擎会遵循以下步骤:

  1. 检查实例自身:首先在对象本身的属性中查找。

  2. 沿原型链追溯:如果自身没有找到,则通过__proto__向上查找其原型对象。

  3. 递归直至终点:此过程会递归进行,直到找到该属性或到达原型链的顶端(Object.prototype,其__proto__null)。如果最终仍未找到,则返回undefined

这种查找机制形成的链条就是原型链,它是 JavaScript 实现继承的基础。

🔑 关键属性与方法的区别

理解以下几个关键概念的区别至关重要:

属性/方法

描述

主要作用

prototype

函数对象拥有。用作未来通过new创建实例的蓝图。

定义需要被实例共享的属性和方法。

__proto__

每个对象实例都有的属性(非标准,但浏览器普遍实现),指向其原型对象。

构成原型链,实现继承查找。

Object.create()

现代 JavaScript 中推荐的创建具有指定原型对象的方法。

显式设置对象间的继承关系。

Object.getPrototypeOf()

标准方法,用于安全地获取指定对象的原型。

替代__proto__进行原型检查。

重要提示:直接通过__proto__修改原型链会影响所有基于该原型的实例,可能导致性能问题和意外行为,应谨慎使用。

🧩 基于原型的继承模式

实现原型继承有几种常见模式,以下是两种经典方法:

  1. 组合继承(最常用)

    结合构造函数继承实例属性和原型链继承共享方法。

    // 父类构造函数 function Animal(name) { this.name = name; } // 在父类原型上定义方法 Animal.prototype.sayName = function() { console.log('My name is ' + this.name); }; // 子类构造函数 function Dog(name, breed) { Animal.call(this, name); // 1. 继承实例属性 this.breed = breed; } // 2. 继承原型方法 Dog.prototype = Object.create(Animal.prototype); // 3. 修复 constructor 指向 Dog.prototype.constructor = Dog; // 4. 子类自定义方法 Dog.prototype.sayBreed = function() { console.log('My breed is ' + this.breed); }; var myDog = new Dog('Buddy', 'Golden Retriever'); myDog.sayName(); // 输出: "My name is Buddy" myDog.sayBreed(); // 输出: "My breed is Golden Retriever"
  2. 使用Object.create()

    直接基于现有原型对象创建新对象,无需构造函数。

    const personPrototype = { greet() { console.log(`Hello, my name is ${this.name}`); } }; const person = Object.create(personPrototype); person.name = 'Alice'; person.greet(); // 输出: "Hello, my name is Alice"

💡 最佳实践与常见问题

💎 总结

prototype是 JavaScript 实现共享行为动态继承的根本机制。理解原型链如何工作、熟悉prototype__proto__和现代继承方法(如class),对于编写高效、可维护的 JavaScript 代码至关重要。

希望这份详细的解释能帮助你彻底掌握 JavaScript 原型!如果你对某个特定细节感兴趣,我们可以继续深入探讨。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 13:35:20

Java 21虚拟线程在Tomcat中的应用(吞吐量暴涨背后的真相)

第一章:Java 21虚拟线程在Tomcat中的吞吐量表现 Java 21引入的虚拟线程(Virtual Threads)作为Project Loom的核心成果,显著提升了高并发场景下的应用吞吐能力。当部署在Tomcat这样的传统Servlet容器中时,虚拟线程能够以…

作者头像 李华
网站建设 2026/4/18 8:21:35

Qwen3-1.7B农业咨询助手:作物病害问答系统案例

Qwen3-1.7B农业咨询助手:作物病害问答系统案例 1. Qwen3-1.7B 模型简介 Qwen3(千问3)是阿里巴巴集团于2025年4月29日开源的新一代通义千问大语言模型系列,涵盖6款密集模型和2款混合专家(MoE)架构模型&…

作者头像 李华
网站建设 2026/4/16 20:20:37

Java 21虚拟线程实战:如何让Tomcat并发处理能力飙升300%?

第一章:Java 21虚拟线程与Tomcat集成的背景与意义 随着现代Web应用对高并发处理能力的需求日益增长,传统基于操作系统线程的服务器模型逐渐暴露出资源消耗大、扩展性受限等问题。Java 21引入的虚拟线程(Virtual Threads)作为Proje…

作者头像 李华
网站建设 2026/4/19 0:55:38

揭秘MyBatis-Plus自动填充机制:如何5分钟搞定 createTime 和 updateTime

第一章:MyBatis-Plus自动填充机制概述 MyBatis-Plus 提供了强大的自动填充功能,用于在数据插入或更新时自动处理某些字段的赋值操作,例如创建时间、更新时间、操作人等。该机制减少了手动设置公共字段的重复代码,提升了开发效率并…

作者头像 李华
网站建设 2026/4/6 21:58:26

开源LLM新突破:IQuest-Coder-V1训练范式解读与部署

开源LLM新突破:IQuest-Coder-V1训练范式解读与部署 1. 引言:面向软件工程的下一代代码大模型 你有没有遇到过这样的情况:写代码时卡在一个复杂的逻辑问题上,调试半天毫无头绪?或者在参与编程竞赛时,面对一…

作者头像 李华