news 2026/6/25 3:24:51

JavaScript原型链:一份会“遗传”的家族传家宝

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JavaScript原型链:一份会“遗传”的家族传家宝

欢迎使用我的小程序👇👇👇👇 俱好用助手功能介绍


你好!如果你曾觉得JavaScript的原型链像魔法一样神秘,那么今天我要告诉你一个秘密:它其实就像一份家族传家宝,代代相传,永远不会丢失!

一个神奇的现象

让我们先来看一段代码,感受一下原型链的神奇之处:

// 创建一个简单的对象constperson={name:'小明',age:25};// 我们从来没有给person添加过toString方法// 但它居然能用!console.log(person.toString());// 输出: "[object Object]"

是不是很神奇?我们没有给person对象定义toString方法,但它却可以调用这个方法!这就是原型链的魔力。

揭开神秘面纱:什么是原型链?

想象一下,你家里有一份“家族传家宝”——一本记录了所有家族成员共同特征的族谱。每个新出生的孩子都会自动“继承”这些家族特征,比如姓氏、家族传统等。

在JavaScript中,每个对象都有一个隐藏的“族谱”,我们称之为“原型”(prototype)。当你访问一个对象的属性或方法时,如果这个对象自己没有,JavaScript就会自动去它的“族谱”(原型)里找,如果还没找到,就继续去原型的原型里找…这样一级一级往上找,就像沿着家族树往上追溯,直到找到为止(或者直到最顶层也没找到,返回undefined)。

这就是原型链

让我们“可视化”原型链

1. 构造函数:家族的“创始祖先”

// 创建一个“家族”的蓝图functionPerson(name,age){this.name=name;this.age=age;}// 给这个家族的所有成员添加一个共同技能Person.prototype.sayHello=function(){console.log(`你好,我是${this.name},今年${this.age}`);};

这里,Person就像一个家族的创始人,而Person.prototype就是家族的“传家宝”(族谱),记录了所有家族成员共有的特征和方法。

2. 创建家族成员

// 创建两个家族成员constxiaoming=newPerson('小明',25);constxiaohong=newPerson('小红',23);// 他们都有自己的独特属性console.log(xiaoming.name);// 小明console.log(xiaohong.name);// 小红// 但他们共享同一个“传家宝”中的方法xiaoming.sayHello();// 你好,我是小明,今年25岁xiaohong.sayHello();// 你好,我是小红,今年23岁

有趣的是,虽然sayHello方法不在xiaomingxiaohong自己身上,但他们都能通过“家族传家宝”访问到它!

看看原型链是如何连接的

让我们来追踪一下这个家族关系:

// xiaoming自己的属性console.log(xiaoming.hasOwnProperty('name'));// trueconsole.log(xiaoming.hasOwnProperty('sayHello'));// false// 但sayHello在它的原型上!console.log(Person.prototype.hasOwnProperty('sayHello'));// true// 看看原型链的连接console.log(xiaoming.__proto__===Person.prototype);// trueconsole.log(Person.prototype.__proto__===Object.prototype);// trueconsole.log(Object.prototype.__proto__);// null - 到头了!

图解原型链家族树

xiaoming │ ├── 自己的属性: name, age │ └── __proto__ → Person.prototype │ ├── 家族共享: sayHello() │ └── __proto__ → Object.prototype │ ├── 全宇宙共享: toString(), valueOf()... │ └── __proto__ → null (宇宙的尽头!)

有趣的实验:沿着原型链“寻宝”

让我们玩一个游戏,看看JavaScript如何沿着原型链寻找属性:

// 创建一个“寻宝地图”functionGrandParent(){this.grandparentSecret="我是爷爷的秘密";}functionParent(){this.parentSecret="我是爸爸的秘密";}functionChild(){this.childSecret="我是孩子的秘密";}// 建立家族关系Parent.prototype=newGrandParent();Child.prototype=newParent();constchild=newChild();// 开始寻宝!console.log(child.childSecret);// 1. 自己身上找到 ✓console.log(child.parentSecret);// 2. 爸爸身上找到 ✓console.log(child.grandparentSecret);// 3. 爷爷身上找到 ✓console.log(child.toString);// 4. 祖传的toString方法 ✓console.log(child.alienSecret);// 5. undefined - 没这个宝物!

现代JavaScript中的原型链

ES6引入了class语法,让原型链的使用更加直观:

classAnimal{constructor(name){this.name=name;}speak(){console.log(`${this.name}发出声音`);}}classDogextendsAnimal{constructor(name,breed){super(name);this.breed=breed;}bark(){console.log(`${this.name}${this.breed})汪汪叫!`);}}constmyDog=newDog('旺财','金毛');myDog.speak();// 继承自AnimalmyDog.bark();// 自己的方法

虽然语法变了,但底层还是那个熟悉的原型链!

为什么原型链很重要?

  1. 内存高效:共享方法只需要存储一次,而不是每个对象都复制一份
  2. 代码复用:通过继承,可以轻松扩展和重用代码
  3. 动态扩展:可以在运行时修改原型,所有实例都会自动获得新能力
// 给所有数组添加一个有趣的方法Array.prototype.sayHello=function(){console.log(`我是一个数组,我有${this.length}个元素`);};[1,2,3].sayHello();// 我是一个数组,我有3个元素

(注意:在实际项目中,修改内置对象的原型通常不是好主意,这只是一个演示!)

总结

JavaScript的原型链就像一份家族传家宝:

  • 每个对象都有自己的小秘密(属性)
  • 但也共享家族的共同财富(原型方法)
  • 当你寻找某个属性时,JavaScript会像寻宝一样沿着家族树向上找
  • 直到找到宝物,或者到达家族树的顶端(null)

现在,当有人提到"原型链"时,你可以微笑着说:“哦,就是JavaScript对象的家族传家宝系统嘛!”

希望这个比喻让你对原型链有了更直观的理解。下次写JavaScript时,不妨想想你正在处理的对象的"家族关系"吧!

记住:在JavaScript的世界里,每个对象都不是孤岛,它们通过原型链连接成一个庞大的家族网络!

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

终极SuperTiled2Unity使用手册:从入门到精通的完整指南

终极SuperTiled2Unity使用手册:从入门到精通的完整指南 【免费下载链接】SuperTiled2Unity Imports Tiled files to Unity. Better than regular Tiled2Unity. 项目地址: https://gitcode.com/gh_mirrors/su/SuperTiled2Unity SuperTiled2Unity是一款专为Uni…

作者头像 李华
网站建设 2026/6/24 6:40:27

振动下的安全防线:ASTM D999如何守护新能源电池运输命脉

随着全球新能源产业蓬勃发展,锂离子电池等新能源产品在运输环节的安全问题日益凸显。ASTM D999-08(2023)《船运集装箱振动测试的标准测试方法》作为国际通用的包装测试规范,为新能源电池的安全运输提供了科学依据和技术支撑,其重要性不容忽视…

作者头像 李华
网站建设 2026/6/23 21:18:36

医疗产品运输安全:ISTA 3A标准应用

在医疗行业,产品从生产到患者手中的安全旅程至关重要。尤其对于生物医药制品和医疗器械,一次不当的运输可能导致产品失效,甚至危及患者生命。ISTA 3A标准作为国际公认的产品运输包装验证体系,为医疗行业提供了科学的测试框架。医疗…

作者头像 李华
网站建设 2026/6/22 18:16:44

AI Agent上线前必须检查的7项文档指标,少一项都可能崩溃

第一章:AI Agent上线前文档检查的重要性在将AI Agent部署到生产环境之前,系统化的文档检查是确保其稳定性、合规性和可维护性的关键环节。完整的文档不仅能帮助开发团队快速定位问题,还能为后续的审计、升级和知识传递提供坚实基础。确保接口…

作者头像 李华
网站建设 2026/6/24 15:43:24

地方2000坐标系的dwg如何导入Cesium

大家好,上一篇我们介绍了如何在Cesium当中导入标准的高斯克吕格投影的坐标系,我们先回忆一下上一篇中说道的DWG坐标系的三种情况: 1.国家2000坐标系 2.地方2000坐标系 3.没有对应位置信息的局部坐标系 我们已经看了第一种情况&#xff0c…

作者头像 李华
网站建设 2026/6/24 5:47:17

99% 的医疗 AI 项目忽视的隐私漏洞,你中招了吗?

第一章:医疗 AI 中隐私泄露的隐形危机在人工智能加速渗透医疗领域的当下,AI 模型通过分析电子病历、医学影像和基因数据显著提升了诊断效率。然而,这些高度敏感信息的集中处理也带来了严重的隐私风险。一旦模型训练或推理过程中缺乏有效的隐私…

作者头像 李华