深入浅出JavaScript 原型链:对象继承的“隐形链条”

深入解析JavaScript原型链继承:从原理到实战应用 面向对象编程(OOP)是软件开发的核心理念,它通过封装、继承和多态来组织代码,提升复用性和可维护性。JavaScript作为一门基于原型的语言,其继承机制与传统的基于类的语言不同,它通过原型链实现对象的属性和方法共享。理解原型链的工作原理,是掌握JavaScript面向对象编程的关键,能够帮助开发者设计出更高效、更优雅的对象复用模式。在实际开发中,原型链继承常与构造函数继承结合,形成组合继承等经典模式,以解决引用类型属性共享等问题。本文将从原型链的核心原理出发,结合构造函数、原型对象与实例的三位一体关系,深 阅读详情

深入浅出JavaScript 原型链:对象继承的“隐形链条”

在 JavaScript 的世界里,原型链(Prototype Chain)是一个核心概念。它如同一条隐形的链条,连接着所有对象,使得代码能够高效地共享属性和方法。理解原型链,不仅能帮助你写出更优雅的代码,还能让你在调试时快速定位问题。


一、从“继承”说起:为什么需要原型链?

想象一个场景:你正在开发一个游戏,游戏中有无数个角色(比如战士、法师、弓箭手)。这些角色共享一些基础能力(如移动、攻击),但又有各自独特的技能。如果每个角色都单独定义这些基础能力,代码会变得冗余且难以维护。

原型链的作用就是解决这个问题。它通过对象之间的关联关系,让所有对象共享一套基础能力,从而节省内存并提高代码的可维护性。


二、原型链的核心:对象与原型

1. 每个对象都有一个原型

在 JavaScript 中,每个对象(除了 null)都有一个隐式原型(__proto__),它指向另一个对象——这个对象就是它的原型。原型本身也是一个对象,因此它也可以有自己的原型,形成一条链式结构。

const obj = {};
console.log(obj.__proto__); // 指向 Object.prototype

2. 构造函数的原型(prototype)

每个函数(包括构造函数)都有一个 prototype 属性,它指向一个对象。当用 new 调用构造函数时,新对象的 __proto__ 会指向这个 prototype。

function Person(name) {
  this.name = name;
}
Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}`);
};

const alice = new Person('Alice');
console.log(alice.__proto__ === Person.prototype); // true

3. 原型链的形成

当访问一个对象的属性或方法时,JavaScript 引擎会沿着对象的原型链向上查找,直到找到目标或到达原型链的尽头(null)。

// 原型链的结构
alice -> Person.prototype -> Object.prototype -> null

三、原型链的工作原理:属性查找的“接力赛”

1. 属性查找的流程

当你访问一个对象的属性时,JavaScript 会执行以下步骤:

  1. 检查对象自身:如果属性存在,直接返回。
  2. 沿原型链查找:如果对象自身没有该属性,则沿着 __proto__ 向上查找原型对象。
  3. 找到或返回 undefined:直到找到目标属性或到达原型链的尽头(null)。
function Animal(name) {
  this.name = name;
}
Animal.prototype.speak = function() {
  console.log(`${this.name} makes a sound.`);
};

const dog = new Animal('Buddy');
dog.speak(); // 输出 "Buddy makes a sound."

在这个例子中:

  • dog 对象自身没有 speak 方法。
  • JavaScript 引擎沿着 dog.__proto__(即 Animal.prototype)找到 speak 方法。

2. 动态性:修改原型会影响所有实例

原型链的动态性是其强大之处,也是潜在的陷阱。修改原型对象的属性或方法,所有实例都会受到影响。

// 修改原型上的方法
Animal.prototype.speak = function() {
  console.log(`${this.name} barks!`);
};

dog.speak(); // 输出 "Buddy barks!"

即使 dog 是在修改前创建的,它也会继承新的 speak 方法。


四、继承的实现:从构造函数到 ES6 的 class

1. 构造函数继承

通过将子类的原型设置为父类的实例,可以实现继承。

function Parent(name) {
  this.name = name;
}
Parent.prototype.sayName = function() {
  console.log(this.name);
};

function Child(name, age) {
  Parent.call(this, name); // 继承属性
  this.age = age;
}
Child.prototype = Object.create(Parent.prototype); // 继承方法
Child.prototype.constructor = Child;

const child = new Child('Lily', 12);
child.sayName(); // 输出 "Lily"

2. ES6 的 class 语法糖

ES6 的 class 本质上是原型继承的语法糖,简化了继承的实现。

class Parent {
  constructor(name) {
    this.name = name;
  }
  sayName() {
    console.log(this.name);
  }
}

class Child extends Parent {
  constructor(name, age) {
    super(name); // 调用父类构造函数
    this.age = age;
  }
  sayAge() {
    console.log(this.age);
  }
}

const child = new Child('DT', 1);
child.sayName(); // 输出 "DT"
child.sayAge();  // 输出 1

五、原型链的实际应用与注意事项

1. 共享方法,节省内存

通过原型链,多个实例可以共享同一个方法,而不是每个实例都保存一份副本。

function Circle(radius) {
  this.radius = radius;
}
Circle.prototype.getArea = function() {
  return Math.PI * this.radius ** 2;
};

const circle1 = new Circle(5);
const circle2 = new Circle(10);
console.log(circle1.getArea === circle2.getArea); // true

2. 原型链的终点:Object.prototype

所有对象的原型链最终都会指向 Object.prototype,这是 JavaScript 对象模型的起点。

console.log(Object.prototype.__proto__); // null

3. 避免原型污染

不要在 Object.prototype 上随意添加属性或方法,这可能导致所有对象意外继承这些属性,引发难以排查的错误。


六、总结:原型链的本质

原型链是 JavaScript 实现对象继承的核心机制。它通过对象之间的关联,让代码能够高效地共享属性和方法。理解原型链,不仅能帮助你写出更高效的代码,还能让你在面对复杂的对象关系时游刃有余。

关键点回顾:

  1. 每个对象都有原型,原型本身也是一个对象。
  2. 属性查找沿原型链向上进行。
  3. 构造函数的 prototype 是共享属性和方法的载体。
  4. ES6 的 class 是原型继承的语法糖。
  5. 动态性和共享性是原型链的双刃剑,需谨慎使用。

七、延伸思考:原型链与现代 JavaScript

随着 ES6 的普及,class 和 extends 逐渐取代了传统的原型链写法,但它们的本质仍是原型继承。理解原型链,能让你更深入地掌握 JavaScript 的底层机制,并在面对性能优化、框架设计等场景时做出更合理的决策。

原型链如同 JavaScript 的“基因链”,它让语言具备了灵活的对象模型。掌握它,你将真正理解 JavaScript 的魅力所在。

JavaScript原型链机制:理解对象属性查找与继承本质 JavaScript 中的‘继承’并非传统面向对象的类复制,而是基于原型链(Prototype Chain)的动态属性查找机制。其核心原理是每个对象内部都存在 [[Prototype]] 链接,引擎按此链逐级向上搜索属性与方法;这种机制赋予了语言高度的灵活性与运行时可塑性,支撑着 Vue 3 响应式、React Fiber 节点关系、Node.js EventEmitter 等关键架构。掌握原型链不仅有助于规避 super() 报错、instanceof 失效、属性覆盖等高频陷阱,更能提升对内存布局、调试技 阅读详情

相关推荐

Python原型链污染漏洞:原理、利用与防御实战指南

在Web安全领域,除了SQL注入、XSS等传统漏洞,一种基于对象属性查找机制的漏洞——原型链污染正受到越来越多的关注。其核心原理在于,当程序在处理外部不可信数据(如用户输入的JSON、YAML)时,若递归合并或更新逻辑未对特殊属性名进行过滤,攻击者可能通过精心构造的键名(如__class__、__base__)污染对象的继承链,从而篡改类属性或方法。这种漏洞的技术价值在于其隐蔽性和影响范围的广泛性,一旦成功,可导致配置篡改、权限绕过,甚至结合模板注入实现远程代码执行。在Python Web开发中,使用Fla

weixin_32736961的博客 344

原型链底层原理:JavaScript对象系统的隐形脉络

原型链的核心机制与JavaScript继承模式 本文深入剖析了JavaScript中原型链的本质、工作原理及应用场景。原型链本质上是一种对象间的隐式委托机制,通过[[Prototype]]内部槽实现属性查找的链式结构。文章详细解析了原型链的三个核心组件:对象的[[Prototype]]、函数的prototype属性以及Object.prototype根节点,并阐述了V8引擎在属性访问时的三步查找流程。 在内存结构方面,原型链以指针形式实现单向链接,与垃圾回收机制协同工作。文章还介绍了原型链在继承模式中的经典

你若盛开,清风自来 974

MAX30102心率血样模块在STM32F103芯片的程序说明

我希望你已经安装好了Keil MDK5这个软件,也安装了M3内核,可以编译一些STM32F103的一些项目下载程序后步骤: 1-按照下图找到IIC.uvprojx并打开(途中唯一绿色那个图标) 2-编译一次 3-确保0错误,0警告,下图所示 4-点击目标选项,然后找到STM32F103C8,再点debug–CMSIS****(我实际用的JTAG,用不了,选择这个CMSIS****即可)下图所示 5-下图所示,看看你的串口找到了没,找到了就点左下角的OK 6-按图上传到开发板 7-MAX30102接线方法

weixin_51357422的博客 5798

《原型链的柔性骨架:JavaScript面向对象架 构的动态设计与演化逻辑》

本文深入剖析JavaScript原型链的本质与架构逻辑,阐释原型作为对象“隐性基因”的动态特性,解析构造器的双重角色,探讨基于原型链的动态继承与拓扑重组。还分析共享与隔离、稳定与演化等核心矛盾的平衡之道,介绍原型思维的实践路径,以及在复杂场景中的应用与风险规避,揭示原型链蕴含的“演化优于设计”等哲学思想,为构建灵活低耦合的JavaScript架构提供深层指引。

xy520521的博客 4019

ABB机器人C#二次开发实战:从通信打通到数据读写的落地指南(附完整工程)

最近在做自动化产线升级项目时,遇到一个核心需求:用C#上位机实时读取ABB机器人的关节角度、IO信号,同时下发运动指令和参数配置。翻遍全网,要么是Robot Studio的基础操作教程,要么是C++/VC++的老旧案例,C#相关的实操内容要么只给片段代码,要么跳过通信配置、权限设置等关键步骤,导致刚上手时踩了无数坑——连接超时、数据读不到、写入无响应,甚至误触发机器人安全保护。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1366

前端新人必读:搞懂原型与原型链,轻松实现对象继承(附实战技巧)

原型与原型链,就像 JavaScript 的“暗线”,平时感受不到,却无处不在。刚学时,你可能被__proto__和prototype绕得头晕眼花;这哪是什么难点,分明是 JS 送给我们的“隐形披风”——穿上它,对象们就能在代码世界里飞檐走壁,自由继承。别急着背概念,多写多错多总结,才是打开原型链的正确姿势。愿你早日练就“看到 new 就想到原型,看到继承就想到寄生组合”的条件反射,从此在面试、开发、修 Bug 的路上,一马平川,回回提前下班。欢迎来到我的博客,很高兴能够在这里和您见面!

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1045

开坑!双向逆变电源实操系列--第一节PFC

文章摘要 本文介绍了PFC(功率因数校正)的基本概念及其重要性。PFC电路通过储能和功率因数校正两大功能,解决交流电小电压大电流的问题,并减少无功电流损耗。文章对比分析了无源PFC(电感串联式、填谷式、LC谐振式)和有源PFC(升压型、交错并联、图腾柱式)的拓扑结构及适用场景。针对2400W双相逆变电源设计,作者选择图腾柱PFC拓扑,详细阐述了设计思路,包括电气参数计算、性能指标设定、技术重点及风险预判。文章还提供了主电路参数定制计算方法,如BOOST电感值的推导过程,为电源工程师提供实用参考。

lyzh971103的博客 2533

javascript 对象原型,原型链,属性枚举

以我自己的理解来阐述一下javascript的对象,原型,原型链,属性枚举javascript的对象,通常是string,array,number,function,Date,null…等等,这是我在使用javascript中经常接触到的.这些都可以看作对象。从javascript的继承及原型来看javascript只有一种结构就是对象。原型与原型链从javascript中的原型应该是null了吧,

可遇,好孩子 1754

2023年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题4)-网络部分解析-附详细代码

2023年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题4)-网络部分解析-附详细代码

bfq05234214的博客 438

基于业务目标的Agent自动化评测体系设计:超越准确率的有效性衡量

我们还是以电商全链路服务Agent我们还是以电商全链路服务Agent。

AI架构全栈开发实战笔记 311

前端知识总结--js原型链

js的原型链听着比较深奥,看着容易晕,梳理一下还是比较容易懂的 (先简单写下,后续有时间再整理) 简而言之 原型链:就是js的对象与对象之间,通过原型组成建立的层层关系,构成了整个链条,称之为原型链 (个人理解,欢迎交流) 对象 js中一切皆对象,我们看到的变量、函数、类型,都是顶级对象Object的实例,也就是说他们继承自Object,这种关系就体现在原型链...

a82022424的博客 232

恒玄BES调试笔记-BES2500如何Dump Anc Audio数据

从YP的4M flash改HP3的2M flash只需要改: 原工程:target.mk的export FLASH_SIZE ?= 0x200000和common.mk里的KBUILD_CPPFLAGS += -DNEW_IMAGE_FLASH_OFFSET=0x100000 OTA工程:target.mk的NEW_IMAGE_FLASH_OFFSET ?= 0x100000和FLASH_SIZE ?= 0x200000 ...

leezs的博客 1663

【JavaScript-Day 25】深入探索:使用 `for...in` 循环遍历 JavaScript 对象属性

本文是JavaScript系列文章的第25篇,重点介绍如何使用for...in循环遍历JavaScript对象属性。文章从对象遍历的必要性出发,深入解析for...in循环的语法结构、遍历顺序规则,并详细说明如何通过hasOwnProperty()方法区分对象自身属性和继承属性。此外,还提供了遍历对象时的性能优化技巧和实际应用场景,帮助开发者避免常见陷阱,高效处理对象数据。作为对象操作系列的重要章节,本文为后续学习对象高级操作打下了坚实基础。

吴师兄大模型的博客 1955

springboot&mybatis中数组和字符串数据类型的转换

/前端数组字段//数据库中字段/*与前端交互时使用的get/set*/System.out.println("接收前端数据");/*与前端交互时使用的get/set*//*与数据库交互时使用的get/set*/System.out.println("从数据库中读取数据");/*与数据库交互时使用的get/set*/

l_q_l的专栏 2470

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【JavaScript-Day 32】深入理解 prototype、\_\_proto\_\_ 与原型链的奥秘**

在 JavaScript 的世界中,对象无处不在。而理解 JavaScript 的原型(Prototype)和原型链(Prototype Chain)机制,是深入掌握这门语言面向对象编程特性、理解继承方式以及高效编写代码的关键。上一篇文章我们初步探讨了构造函数如何创建对象,但构造函数本身并不能完全解决代码复用和共享的问题。今天,我们将深入挖掘对象的“共享空间”——原型,以及它如何构建起强大的原型链。准备好了吗?让我们一起揭开 JavaScript 原型机制的神秘面纱!

吴师兄大模型的博客 1446

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【JavaScript-Day 33】深入浅出 ES6 Class:从入门到精通面向对象新姿势

在 JavaScript 的世界里,面向对象编程(OOP)一直是一个核心概念。在 ES6(ECMAScript 2015)出现之前,我们主要依赖构造函数和原型链来实现对象的创建和继承,这种方式虽然强大,但语法上对于习惯了类(Class)语法的开发者来说略显繁琐和不直观。ES6 `class` 关键字的引入,为 JavaScript 提供了一种更简洁、更清晰、更易于理解的面向对象编程方式。它本质上是基于原型继承的语法糖,但极大地提升了代码的可读性和易维护性。

吴师兄大模型的博客 807

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【面试题】简单的说说对原型链的了解

今天我的同事来问我,XX哥,这个原型链是什么东西?“哈?这都不知道,你搞什么前端??” “我本来就不是前端,我搞AI的” “哦对哦,那我错怪你了,行吧 那今天我给你说得简单点(毕竟我只是简单地理解了)”作为Javascript的基础之一,原型一直贯穿我们的JS代码并且成为面试的常考问题。用我自己的话去理解,原型就是类,通过创建(new)一个实例的方法去继承这个类的属性跟方法,而原型链就是一个不断继承的链条,到了顶级(Object)会用null去终止这个链条的延伸。用官方的解释就是。

web全栈开发的博客 442

js的原型链

js原型```//构造函数function Dog(name){ this.name = name this.age = 1}//实例1var example = new Dog()example.name = "213"example.age = 2console.log(example.name,example.age)--> 213 2//实例2var test = n...

weixin_30757793的博客 70

JS原型核心笔记:prototype、__proto__、constructor

JS原型核心概念速记:构造函数(工厂)创建实例对象(产品),通过prototype关联原型对象(公共仓库)。三大属性:构造函数.prototype指向原型对象;实例.__proto__指向原型对象;原型对象.constructor指回构造函数。高频误区:构造函数内方法不可共享,不同构造函数的原型对象独立。原型链查找规则:实例→原型→Object.prototype→null。口诀:prototype是共享仓库,__proto__是查找通道,constructor是溯源标记。

zhangke2024的博客 180

ProtoType原型和__Proto__原型链的详解

var arr = new Array(12,13,14,15,16,17,18); var arr2 = new Array(12,13); arr.sun=function(){  //用原型加Array.prototype.sun=function() 下面的alert(arr2.sun())生效,就不会出现说arr2没有sun方法,这就好像css里面的class...

weixin_30243533的博客 104

揭秘DOM节点操作的七大绝招,轻松掌控网页生命线!

在前端开发的世界里,DOM(文档对象模型)如同网页的“神经系统”,而开发者则是这个神经系统的“指挥官”。无论是动态加载内容、实现交互特效,还是构建复杂的Web应用,掌握DOM节点的操作方法都至关重要。今天,我们就来揭开DOM节点操作的神秘面纱,带你用最接地气的方式,学会这门“操控网页生命线”的绝技!

JakeMa1024的博客 3000
上一篇: 深入浅出CMD与PowerShell:Windows命令行工具的“进化论”
下一篇: 深入浅出:JavaScript 中 `call` 与 `apply` 的奥秘
coding随想
博客等级 码龄9年 2002粉丝 546原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coding随想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值