JS原型链深度解析
# 深入浅出JavaScript原型链从概念到实践1. 原型链是什么想象一下家族族谱。你从父母那里继承了某些特征你的父母又从他们的父母那里继承了特征这样一代代向上追溯就形成了一个继承链条。JavaScript中的原型链与这个家族继承的概念非常相似。在JavaScript中每个对象都有一个隐藏的“原型”属性这个属性指向另一个对象。当你访问一个对象的属性时如果这个对象本身没有这个属性JavaScript引擎就会去它的原型对象上查找。如果原型对象上也没有就会继续去原型对象的原型上查找这样一层层向上直到找到这个属性或者到达链条的末端null。这个查找路径就像一条链条所以被称为“原型链”。// 一个简单的例子constperson{name:张三,sayHello(){console.log(你好我是${this.name});}};conststudentObject.create(person);// student的原型是personstudent.id2023001;// student本身没有sayHello方法但通过原型链可以找到student.sayHello();// 输出你好我是张三2. 原型链能做什么2.1 实现属性和方法的共享原型链最核心的作用是实现代码复用。就像工厂使用模具批量生产产品一样原型允许我们创建具有相同特征的对象而不需要为每个对象重复定义相同的属性和方法。// 定义一个“车辆”原型constvehiclePrototype{wheels:4,start(){console.log(车辆启动);},stop(){console.log(车辆停止);}};// 创建具体的车辆constcar1Object.create(vehiclePrototype);car1.brandToyota;constcar2Object.create(vehiclePrototype);car2.brandHonda;// 两个车共享了wheels属性和start、stop方法console.log(car1.wheels);// 4console.log(car2.wheels);// 42.2 实现继承机制在面向对象编程中继承允许我们基于现有类创建新类。JavaScript通过原型链实现了类似的继承机制。functionAnimal(name){this.namename;}Animal.prototype.speakfunction(){console.log(${this.name}发出声音);};functionDog(name,breed){Animal.call(this,name);// 调用父类构造函数this.breedbreed;}// 设置原型链Dog.prototype的原型是Animal.prototypeDog.prototypeObject.create(Animal.prototype);Dog.prototype.constructorDog;Dog.prototype.barkfunction(){console.log(${this.name}汪汪叫);};constmyDognewDog(小黑,拉布拉多);myDog.speak();// 小黑发出声音myDog.bark();// 小黑汪汪叫2.3 扩展内置对象原型链允许我们为JavaScript内置对象添加自定义方法这在某些场景下非常有用。// 为所有数组添加一个求和方法Array.prototype.sumfunction(){returnthis.reduce((total,num)totalnum,0);};constnumbers[1,2,3,4,5];console.log(numbers.sum());// 153. 怎么使用原型链3.1 构造函数模式这是最传统的方式通过构造函数和new关键字创建对象。functionPerson(name,age){this.namename;this.ageage;}Person.prototype.introducefunction(){console.log(我叫${this.name}今年${this.age}岁);};constperson1newPerson(李四,25);person1.introduce();// 我叫李四今年25岁3.2 Object.create()方法ES5引入了Object.create()方法可以直接基于现有对象创建新对象。constbaseObject{baseMethod(){console.log(这是基础方法);}};constnewObjectObject.create(baseObject);newObject.customMethodfunction(){console.log(这是自定义方法);};newObject.baseMethod();// 这是基础方法3.3 Class语法糖ES6引入了class语法它本质上仍然是基于原型的但提供了更清晰的语法。classAnimal{constructor(name){this.namename;}speak(){console.log(${this.name}发出声音);}}classDogextendsAnimal{constructor(name,breed){super(name);this.breedbreed;}bark(){console.log(${this.name}汪汪叫);}}constdognewDog(小白,柯基);dog.speak();// 小白发出声音dog.bark();// 小白汪汪叫4. 最佳实践4.1 避免直接修改内置对象的原型虽然可以扩展内置对象但这样做可能导致代码冲突和难以调试的问题。如果确实需要应该使用polyfill模式。// 不好的做法Array.prototype.customMethodfunction(){/* ... */};// 更好的做法检查方法是否已存在if(!Array.prototype.customMethod){Array.prototype.customMethodfunction(){/* ... */};}4.2 优先使用class语法对于现代JavaScript开发class语法更清晰、更易理解并且与其他编程语言的类概念更一致。// 使用class而不是传统的构造函数classUser{constructor(name,email){this.namename;this.emailemail;}getInfo(){return${this.name}(${this.email});}}4.3 注意原型链的性能影响过深的原型链会影响属性查找的性能。通常保持原型链在3-4层以内是比较合理的。// 避免创建过深的原型链// 三层原型链通常是合理的// 对象 - 类原型 - 父类原型 - Object.prototype4.4 使用hasOwnProperty检查属性来源当需要确定属性是对象自身的还是继承自原型链时使用hasOwnProperty方法。constobj{ownProp:自己的属性};// 设置原型constprototypeObj{inheritedProp:继承的属性};Object.setPrototypeOf(obj,prototypeObj);console.log(obj.hasOwnProperty(ownProp));// trueconsole.log(obj.hasOwnProperty(inheritedProp));// false4.5 谨慎使用原型链实现多重继承JavaScript本身不支持多重继承虽然可以通过混合模式模拟但这会增加复杂性。// 使用混合模式而不是复杂的原型链classA{methodA(){console.log(A的方法);}}classB{methodB(){console.log(B的方法);}}classC{constructor(){this.anewA();this.bnewB();}methodA(){returnthis.a.methodA();}methodB(){returnthis.b.methodB();}}5. 和同类技术对比5.1 原型链 vs 类传统面向对象语言在Java、C等传统面向对象语言中类是对象的蓝图继承发生在编译时。而在JavaScript中原型链提供的是运行时的动态继承。关键区别传统类基于类的继承结构固定原型链基于原型的委托动态灵活// JavaScript的原型链允许运行时修改functionAnimal(){}Animal.prototype.speakfunction(){console.log(动物声音);};constdognewAnimal();dog.speak();// 动物声音// 运行时修改原型Animal.prototype.speakfunction(){console.log(修改后的声音);};dog.speak();// 修改后的声音5.2 原型链 vs 组合模式组合模式通过将对象组合在一起来实现功能复用而不是通过继承。// 使用组合而不是继承constcanEat{eat(food){console.log(吃${food});}};constcanWalk{walk(){console.log(行走);}};functionPerson(name){this.namename;// 组合功能Object.assign(this,canEat,canWalk);}constpersonnewPerson(王五);person.eat(苹果);// 吃苹果person.walk();// 行走5.3 原型链 vs 函数式编程函数式编程通过高阶函数和组合来实现代码复用而不是通过对象和继承。// 函数式方式使用函数组合constwithLogging(fn)(...args){console.log(调用函数:${fn.name});returnfn(...args);};constadd(a,b)ab;constloggedAddwithLogging(add);console.log(loggedAdd(2,3));// 调用函数: add \n 55.4 现代JavaScript中的选择在现代JavaScript开发中通常有以下选择class语法大多数情况下的首选语法清晰易于理解工厂函数组合需要更灵活的对象创建时使用函数式编程处理数据转换和异步操作时更合适原型链直接操作需要底层控制或创建特殊数据结构时使用总结JavaScript原型链是该语言的核心特性之一它提供了一种灵活的对象继承机制。理解原型链的工作原理对于深入理解JavaScript至关重要。在实际开发中虽然现代class语法掩盖了大部分原型细节但了解底层机制仍然有助于编写更高效、更健壮的代码。选择使用原型链、class、组合还是函数式编程取决于具体的应用场景和团队偏好。重要的是理解每种方法的优缺点并在合适的场景使用合适的技术。

相关新闻

DeepSeek-OCR-2新手指南:无需代码的文档识别工具

DeepSeek-OCR-2新手指南:无需代码的文档识别工具

DeepSeek-OCR-2新手指南:无需代码的文档识别工具 重要提示:本文介绍的DeepSeek-OCR-2工具完全在本地运行,无需编程基础,所有操作通过浏览器界面完成,确保文档处理的隐私和安全。 1. 工具简介:什么是DeepSee…

2026/7/3 3:29:54 阅读更多 →
DeerFlow保姆级教程:DeerFlow中WebUI主题切换与无障碍访问(a11y)配置

DeerFlow保姆级教程:DeerFlow中WebUI主题切换与无障碍访问(a11y)配置

DeerFlow保姆级教程:DeerFlow中WebUI主题切换与无障碍访问(a11y)配置 1. 认识你的深度研究助理:DeerFlow 如果你经常需要从海量信息中快速提炼观点、生成专业报告,甚至制作播客内容,那么DeerFlow可能就是…

2026/5/17 5:35:48 阅读更多 →
AI专著写作工具大揭秘,让你从写作小白变身专著能手

AI专著写作工具大揭秘,让你从写作小白变身专著能手

创新与 AI 工具助力学术专著写作 创新是学术专著的核心所在,也是写作过程中的一大难关。一部优质的专著,不能仅仅是对已有研究成果的简单汇总,而应当提出贯穿整部著作的新颖观点、理论框架或研究方法。在浩如烟海的学术文献面前,…

2026/7/7 17:06:18 阅读更多 →

最新新闻

★★★ 隐身截屏Pro V1.0 发布 - 功能强大的自动屏幕截图工具,支持隐身、密保功能

★★★ 隐身截屏Pro V1.0 发布 - 功能强大的自动屏幕截图工具,支持隐身、密保功能

软件简介 【隐身截屏Pro(HiddenShot Pro)】 - 多种截屏模式、支持窗口过滤精控截屏内容。一款功能强大的自动截屏工具,支持隐身、密保功能。软件有多种截图模式,包括:全屏、固定区域、鼠标周围、鼠标下控件、活动窗口…

2026/7/7 22:48:16 阅读更多 →
macOS启动盘制作全解析:镜像下载、U盘格式与Apple Silicon兼容性

macOS启动盘制作全解析:镜像下载、U盘格式与Apple Silicon兼容性

1. 项目概述:为什么 macOS 启动盘不是“下载个镜像点几下鼠标”就能搞定的事 macOS 系统镜像文件下载及制作 macOS 安装启动盘,这十个字背后藏着苹果生态里最典型的一类“表面简单、实则暗坑密布”的操作。我从 2013 年用 MacBook Pro 搭建第一台 Hacki…

2026/7/7 22:48:16 阅读更多 →
SHAP可视化终极实战指南:从入门到精通掌握模型解释艺术

SHAP可视化终极实战指南:从入门到精通掌握模型解释艺术

SHAP可视化终极实战指南:从入门到精通掌握模型解释艺术 【免费下载链接】shap A game theoretic approach to explain the output of any machine learning model. 项目地址: https://gitcode.com/gh_mirrors/sh/shap SHAP(SHapley Additive exPl…

2026/7/7 22:44:15 阅读更多 →
【2027最新】基于SpringBoot+Vue的笔记记录分享网站管理系统源码+MyBatis+MySQL

【2027最新】基于SpringBoot+Vue的笔记记录分享网站管理系统源码+MyBatis+MySQL

博主介绍:👨‍💻 专业背景 资深全栈架构师,深耕技术领域多年,致力于为开发者提供专业技术指导。拥有丰富的企业级项目经验,全网技术分享累计影响超过10万名开发者。 荣誉认证 CSDN特邀作者 & 技术专家 …

2026/7/7 22:44:15 阅读更多 →
pandas数据准备实战:清洗、填充、编码与管道构建

pandas数据准备实战:清洗、填充、编码与管道构建

1. 项目概述:为什么数据准备不是“配菜”,而是整道大餐的底味? 在真实的数据分析项目里,我见过太多人一上来就急着调用 sklearn 建模、画 matplotlib 图表,结果跑出来的模型 R 低得让人怀疑人生,可视化…

2026/7/7 22:42:15 阅读更多 →
Power Pivot数据建模实战:从Excel到语义分析平台

Power Pivot数据建模实战:从Excel到语义分析平台

1. 项目概述:这不是Excel,是数据建模的“手术台”你打开Excel,习惯性点开“数据”选项卡,准备用透视表拉个汇总——结果发现“数据模型”按钮灰了,“管理关系”根本点不动。别急,这不是你的Excel坏了&#…

2026/7/7 22:40:14 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻