当前位置: 首页 > news >正文

Day3 完整学习包(原型 原型链)——2026 0312

1. 原型核心概念(3 个核心对象)

表格

概念归属作用
prototype函数专属构造函数的原型对象,存放共享属性 / 方法,所有实例可访问(Function.prototype
__proto__所有对象专属实例的原型指针,指向其构造函数的prototype(如obj.__proto__ === Object.prototype
constructor原型对象专属指向关联的构造函数(如Object.prototype.constructor === Object

2. 原型链核心逻辑

  • 定义:当访问对象的属性 / 方法时,JS 会先在对象自身查找,找不到则通过__proto__向上查找其构造函数的prototype,直到Object.prototype(顶端),这条查找链路就是原型链;
  • 终止条件:顶端Object.prototype.__proto__ === null,查找不到则返回undefined
  • 核心作用:实现 JS 的继承机制,是面向对象的底层基础。

3. 原型继承(ES5 核心方式)

  • 本质:通过修改实例的__proto__指向父类构造函数的prototype,让子类实例能访问父类的共享属性 / 方法。

二、手写原型继承案例(40 分钟必练)

案例 1:基础原型继承(核心写法)

js

// 1. 定义父类(构造函数) function Parent(name) { this.name = name; // 实例私有属性 this.sayHi = function() { // 实例私有方法(不推荐,每个实例都会创建) console.log(`Hi, ${this.name}`); }; } // 父类原型方法(共享方法,所有实例复用) Parent.prototype.eat = function(food) { console.log(`${this.name} eat ${food}`); }; // 2. 定义子类 function Child(name, age) { // 继承父类私有属性(调用父类构造函数,绑定this) Parent.call(this, name); this.age = age; // 子类私有属性 } // 3. 核心:继承父类原型方法 // 方式1:直接赋值(简单但会修改父类原型) // Child.prototype = Parent.prototype; // 方式2:推荐——创建中间对象,隔离子类与父类原型 Child.prototype = Object.create(Parent.prototype); // 修复constructor指向(否则Child.prototype.constructor === Parent) Child.prototype.constructor = Child; // 4. 子类原型方法(不影响父类) Child.prototype.run = function() { console.log(`${this.name} is ${this.age} years old, running`); }; // 5. 测试 const child = new Child("小明", 10); child.sayHi(); // Hi, 小明(继承父类私有方法) child.eat("苹果"); // 小明 eat 苹果(继承父类原型方法) child.run(); // 小明 is 10 years old, running(子类原型方法) console.log(child.constructor); // Child(修复后正确指向) console.log(child.__proto__ === Child.prototype); // true console.log(Child.prototype.__proto__ === Parent.prototype); // true(原型链链路)

案例 2:原型链查找验证

js

// 验证原型链顶端 const obj = {}; console.log(obj.__proto__ === Object.prototype); // true console.log(Object.prototype.__proto__); // null(原型链终点) // 验证属性查找顺序 obj.name = "小红"; Object.prototype.age = 20; console.log(obj.name); // 小红(自身属性) console.log(obj.age); // 20(原型链查找) console.log(obj.gender); // undefined(原型链找不到)

三、核心面试题 + 标准答案(20 分钟背会)

面试题:原型链怎么理解?

标准答案(高级工程师视角,精简且有深度)
1. 原型链的本质

原型链是 JavaScript 实现继承的底层机制,核心基于__proto__(实例的原型指针)和prototype(构造函数的原型对象)的关联关系:当访问对象的属性 / 方法时,JS 会先查找对象自身,若不存在则通过__proto__向上查找其构造函数的prototype,直到原型链顶端Object.prototype,这条逐级查找的链路就是原型链。

2. 原型链的核心特征
  • 单向链路:所有对象的原型链最终指向Object.prototype,而Object.prototype.__proto__ === null(终止条件);
  • 属性复用:原型对象(prototype)存放共享属性 / 方法,所有实例可通过原型链访问,避免重复创建,提升内存效率;
  • 动态性:修改原型对象的属性 / 方法,所有实例(包括已创建的)都能立即感知(原型链查找是动态的)。
3. 实际开发中的应用
  • 自定义构造函数复用方法:将通用方法挂载到prototype上(如表单验证、数据格式化方法),避免每个实例重复创建函数;
  • 理解内置对象原型链:如Array.prototype.forEachString.prototype.slice,本质是通过原型链实现内置方法的共享;
  • ES6 Class 的底层逻辑class/extends是原型链的语法糖,底层仍基于prototype__proto__实现继承。
4. 加分补充(体现深度)
  • 避免直接修改__proto__(性能差且易导致原型污染),推荐用Object.create()实现原型继承;
  • 原型链查找是 “读操作”,赋值操作仅修改对象自身属性,不会影响原型对象(如obj.age = 20仅给 obj 加 age 属性,不会改Object.prototype.age)。

四、错题整理模板(10 分钟完成)

表格

错题类型错误代码 / 场景错误原因正确思路 / 知识点
原型继承错误Child.prototype = Parent.prototype子类原型直接指向父类,修改子类会污染父类用 Object.create () 创建中间对象隔离
constructor 指向错误继承后未修复 constructorChild.prototype.constructor 指向 Parent手动赋值Child.prototype.constructor = Child
原型链理解偏差认为 “赋值操作会修改原型属性”混淆原型链 “读” 和 “写” 逻辑赋值仅改自身属性,读才走原型链查找

总结

  1. 核心考点:原型链的核心是「__proto__串联prototype的查找链路」,继承是其核心应用;
  2. 实战重点:必须能手写原型继承(Object.create()+call()+ 修复 constructor),这是 ES5 继承的核心;
  3. 易错点:避免直接修改__proto__、注意修复 constructor 指向、区分原型链的 “读 / 写” 逻辑。
http://www.jsqmd.com/news/470325/

相关文章:

  • Maxwell变压器有限元建模仿真教学指南:涵盖单相、三相、高频、分离及差动变压器等多类型仿真...
  • pwn练习笔记19-20
  • 【图像去噪】量子物理薛定谔方程解的自适应去噪(含 SSIM PSNR MMSE)【含Matlab源码 15147期】
  • 【Azure Container App】Debug Console的调试工具试验(三)--openssl/traceroute/ca-certificates/bind-utils/tcpping
  • Python代码如何加密之后再执行?
  • Adobe Dreamweaver 完整操作步骤(全版本通用)
  • 【VSCode学习02】 Visual Studio Code简介
  • 计算机毕业设计源码:基于Python的商品数据分析与随机森林销量预测系统 Django 可视化 数据分析 机器学习 爬虫 深度学习 大模型 大数据(建议收藏)✅
  • salesforce零基础学习(一百四十四)External Client App浅谈
  • mac电脑查看安装的mysql版本以及启动
  • 算法设计中的抽象数据类型与泛型思维的技术6
  • 第三方应用程序漏洞
  • 免费用上AI翻译!简约翻译 + Cerebras大模型,网页翻译从此告别机器腔— 全程零费用,5分钟搞定 —
  • CTFshow web入门 web1-10
  • PTA 2025年天体模拟赛L3-1 City不City (C++ 含代码解释)
  • 有效的字母异位词 - 题目笔记
  • 中控IFace考勤机二开内存问题解决方案
  • 【IEEE出版、连续五届EI稳定检索、211高校主办】第六届信号图像处理与通信国际学术会议(ICSIPC 2026)
  • 使用 C++、YOLO 和 ONNX Runtime 实现实时目标检测的完整教程整理与代码实现指南。
  • Flutter 三方库 graph_kit 的鸿蒙化适配指南 - 让逻辑治理回归“拓扑之美”,打造鸿蒙应用专家级的图算法与依赖治理中台
  • 教你如何用GPT-来分析你的dump文件定位内存泄漏问题——避免无效加班必备神器
  • 高可用高并发微服务架构设计:Nginx 与 API Gateway 的协同实践
  • Xsvn:鸿蒙系统首款SVN客户端
  • ImageToTensor函数的完整实现版本,專門用在 .NET MAUI + YOLOv8 ONNX 推理流程中
  • 基于51单片机手机无线蓝牙APP遥控智能车系统论文
  • DeepSORT 参数调优指南(实用版,针对工业/安防/实时场景)
  • 使用surging 常见的几个问题
  • HTML粒子爱心代码
  • 指针与数组:高效访问的秘诀
  • 918. 环形子数组的最大和