基础知识|原型在什么时候用和类的区别
在 JavaScript 中,原型和类是两个密切相关但有所不同的概念。理解这两者之间的差异有助于更好地掌握面向对象编程(OOP)在 JavaScript 中的实现。
1. 原型(Prototype)
原型是 JavaScript 中实现继承和共享行为的核心机制。每个函数在被用作构造函数创建对象时,都会自动获得一个 prototype 属性,指向一个包含共享方法和属性的对象。
-
原型的作用: 原型提供了一个可以在对象实例间共享的方法或属性的地方。当你访问对象的方法或属性时,如果该对象自身没有该属性或方法,JavaScript 会沿着原型链向上查找,直到找到或达到原型链的末端(
null)。 -
什么时候用原型:
- 共享方法和属性: 当你希望所有实例共享某些方法或属性时,可以将它们定义在构造函数的原型上,而不是每个实例上。例如,你想给所有
MyLinkedList的实例添加一个get方法,可以将它定义在MyLinkedList.prototype上。 - 继承: 通过
prototype你可以实现继承,让一个对象从另一个对象继承方法和属性。通过Object.create()或class语法,JavaScript 使用原型链来建立对象之间的继承关系。
- 共享方法和属性: 当你希望所有实例共享某些方法或属性时,可以将它们定义在构造函数的原型上,而不是每个实例上。例如,你想给所有
-
// 定义构造函数 function Person(name) {this.name = name; }// 定义原型方法 Person.prototype.sayHello = function() {console.log('Hello, ' + this.name); };// 创建实例 const person1 = new Person('Alice'); person1.sayHello(); // 输出 "Hello, Alice"2. 类(Class)
类是 JavaScript 在 ECMAScript 6(ES6)引入的一个新语法,它是构造函数和原型的语法糖,提供了一种更接近传统面向对象语言(如 Java、C++)的方式来创建对象和定义方法。
-
类的作用: 类是用于创建对象的蓝图,定义了构造函数和实例方法。类的每个实例都会有自己的属性,但共享类中的方法。虽然语法上类提供了更清晰、更简洁的方式,但它在底层依然依赖原型机制。
-
什么时候用类:
- 创建对象: 如果你想使用面向对象的编程风格来创建对象,并通过类提供更清晰的结构,可以使用
class。 - 继承: 类的继承非常直观,使用
extends关键字可以轻松继承另一个类的属性和方法。 - 更易维护: 类提供了更简洁的语法,特别是当涉及到继承和代码组织时,比原型链方式更加清晰和易于维护。
- 创建对象: 如果你想使用面向对象的编程风格来创建对象,并通过类提供更清晰的结构,可以使用
class Person {constructor(name) {this.name = name;}sayHello() {console.log('Hello, ' + this.name);}
}const person2 = new Person('Bob');
person2.sayHello(); // 输出 "Hello, Bob"
这里,Person 类的实例有一个 sayHello 方法。class 语法自动处理了原型链的创建,实例对象通过类自动继承这些方法
3. 原型与类的区别
| 特性 | 原型 (Prototype) | 类 (Class) |
|---|---|---|
| 定义方式 | 使用构造函数和 prototype 来定义方法 | 使用 class 关键字来定义 |
| 方法共享 | 方法通过 prototype 共享 | 方法默认在类的原型上共享(但语法更加简洁) |
| 继承机制 | 使用 prototype 和 Object.create() 来继承 | 使用 extends 关键字来继承 |
| 可读性和简洁性 | 比较底层,需要手动操作原型链 | 语法糖,结构清晰,易于理解 |
| 底层实现 | 依赖原型链机制 | 底层还是基于原型链实现,class 是对原型的封装 |
4. 原型链与类继承的关系
虽然 class 语法是对 prototype 机制的封装,但它本质上还是依赖原型链来实现继承。class 会自动处理原型的设置,使得代码更加简洁易读。
例如,使用 class 语法继承另一个类时,JavaScript 内部实际上是在做原型链的设置。来看这个例子:
class Animal {speak() {console.log('Animal speaking');}
}class Dog extends Animal {speak() {console.log('Dog barking');}
}const dog = new Dog();
dog.speak(); // 输出 "Dog barking"
这里,Dog 类继承了 Animal 类。在底层,Dog 会通过 __proto__ 属性指向 Animal 类的原型。这意味着 Dog 的实例可以访问 Animal 类的 speak 方法,除非它自己定义了该方法(如这里所示)。
5. 什么时候选择使用原型,什么时候使用类
-
使用原型:
- 当你想直接操作原型链或实现更底层的继承时,原型机制非常灵活且高效。
- 当你在学习 JavaScript 面向对象的实现原理时,原型链机制能帮助你理解 JavaScript 中的继承、方法共享等概念。
-
使用类:
- 当你希望代码结构更加简洁、易读且更接近传统面向对象语言时,使用
class会更直观。 - 如果你的项目需要清晰的继承体系和方法组织,使用
class可以让代码更容易维护。
- 当你希望代码结构更加简洁、易读且更接近传统面向对象语言时,使用
总结
- 原型是 JavaScript 中实现继承的核心机制,每个构造函数都有一个
prototype属性,用于定义共享方法和属性。 - 类是对原型机制的语法糖,使得面向对象编程的风格在 JavaScript 中更加直观和易用。
- 虽然
class提供了更简洁的语法,但底层仍然依赖原型链。因此,你可以把类看作是对原型机制的封装,它让继承和方法共享的实现更易于理解和使用。
相关文章:
基础知识|原型在什么时候用和类的区别
在 JavaScript 中,原型和类是两个密切相关但有所不同的概念。理解这两者之间的差异有助于更好地掌握面向对象编程(OOP)在 JavaScript 中的实现。 1. 原型(Prototype) 原型是 JavaScript 中实现继承和共享行为的核心机…...
【FFmpeg】拉流
概述 项目实践中涉及到使用ffmpeg进行推流和拉流操作,本文主要对一些基本操作做一个学习总结,后续再学习其源码架构;总结方法遵循实现功能配合函数具体实现 基本使用 拉流 avformat_network_init();//日志输出等级set_ffmpeg_log_level();…...
LangChain构建行业知识库实践:从架构设计到生产部署全指南
文章目录 引言:行业知识库的进化挑战一、系统架构设计1.1 核心组件拓扑1.2 模块化设计原则二、关键技术实现2.1 文档预处理流水线2.2 混合检索增强三、领域适配优化3.1 医学知识图谱融合3.2 检索结果重排序算法四、生产环境部署4.1 性能优化方案4.2 安全防护体系五、评估与调优…...
解决jupyter notebook不是内部或外部命令问题
我们打开cmd有的时候,输入jupyter notebook,发现会提示jupyter 不是内部或外部命令,也不是可运行的程序或批处理文件。遇到这个问题我们应该怎么解决呢? 没错就是添加环境变量! Step01:在电脑中找到jupyter notebook的…...
MySQL----case的用法
在 MySQL 中,CASE 表达式是一个用于条件判断的功能,可以根据不同的条件返回不同的结果。CASE 表达式通常用于 SELECT 查询语句中,可以在 SQL 中灵活地进行条件判断和数据转换。CASE 有两种基本的语法形式: 简单 CASE 表达式&…...
Unity XR-XR Interaction Toolkit开发使用方法(十)组件介绍(XR Interaction Group)
目录 一、插件介绍 二、主要组件 XR Interaction Manager XR Controller XR Interactor XR Direct Interactor XR Ray Interactor XR Socket Interactor XR Gaze Interactor 三、XR Interaction Group 1、组件介绍 2、核心功能与特点 优先级与冲突管理 动态交互切…...
深入理解 并查集LRUCaChe
并查集&LRUCaChe 个人主页:顾漂亮 文章专栏:Java数据结构 1.并查集的原理 在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后根据一定规律将归于同一组元素的…...
详解 c++ 中的 namespage
C 中的命名空间很特别,其他编程语言基本都没有。命名空间介于函数与类之间,兼顾了二者的一些优点。这篇博客根据 chatgpt 的回答整理。 文章目录 **1. 什么是 namespace(命名空间)?****2. 语法****3. 使用 namespace 访…...
50周学习go语言:第五周 复合类型与词频统计
以下是第五周复合类型(数组、切片与映射)的详细学习内容,按照第四周的深度要求设计: 第五周:复合类型与词频统计 一、复合类型详解 1. 数组(Array) // 声明与初始化 var arr1 [3]int …...
HTTP非流式请求 vs HTTP流式请求
文章目录 HTTP 非流式请求 vs 流式请求一、核心区别 服务端代码示例(Node.js/Express)非流式请求处理流式请求处理 客户端请求示例非流式请求(浏览器fetch)流式请求处理(浏览器fetch) Python客户端示例&…...
深圳南柯电子|医疗设备EMC测试整改检测:零到一,保障医疗安全
在当今医疗科技飞速发展的时代,医疗设备的电磁兼容性(EMC)已成为确保其安全、有效运行的关键要素之一。EMC测试整改检测不仅关乎设备的性能稳定性,更是保障患者安全、避免电磁干扰引发医疗事故的重要措施。 一、医疗设备EMC测试整…...
详解:事务注解 @Transactional
创作内容丰富的干货文章很费心力,感谢点过此文章的读者,点一个关注鼓励一下作者,激励他分享更多的精彩好文,谢谢大家! Transactional 是 Spring Framework 中常用的注解之一,它可以被用于管理事务。通过使…...
【虚拟仪器技术】labview操作指南和虚拟仪器技术习题答案(一)
今天是2025年2月24日,画的是fate/Grand Order里面的阿尔托莉雅.卡斯特,武内老师的画。 目录 第1章 第2章 第3章 第4章 第5章 关注作者了解更多 我的其他CSDN专栏 毕业设计 求职面试 大学英语 过程控制系统 工程测试技术 虚拟仪器技术 可编程…...
在Linux桌面上创建Idea启动快捷方式
1、在桌面新建idea.desktop vim idea.desktop [Desktop Entry] EncodingUTF-8 NameIntelliJ IDEA CommentIntelliJ IDEA Exec/home/software/idea-2021/bin/idea.sh Icon/home/software/idea-2021/bin/idea.svg Terminalfalse TypeApplication CategoriesApplication;Developm…...
渗透测试(WAF过滤information_schema库的绕过,sqllib-46关,海洋cms9版本的注入)
1.sqlin-lib 46关 打开网站配置文件发现 此网站的对ID进行了排序,我们可以知道,order by接不了union ,那我们可以通过测试sort,rond等函数,观察网页的反馈来判断我们的盲注是否正确 我们发现 当参数有sort来排序时&…...
Unity基础——资源导出分享为Unity Package
一.选中要打包的文件夹,右击,点击Exporting package 二.勾选 Include Dependencies,点击Export Include Dependencies:代表是否包含资源依赖的选项 三.选择保存的位置,即可生成Unity package 最终形成文件:…...
C语言【指针篇】(三)
C语言【指针篇】(三) 前言正文1. 数组名的理解2. 使用指针访问数组3. 一维数组传参的本质4. 冒泡排序5. 二级指针6. 指针数组7. 指针数组模拟二维数组 总结 前言 本文主要基于前面对指针的掌握,进一步学习:数组名的理解、使用指针…...
DevSecOps普及:安全与开发运维的深度融合
一、引言 随着软件开发模式的演进,DevOps已成为现代软件工程的主流实践。然而,在传统的DevOps流程中,安全往往被视为开发和运维之外的额外环节,导致安全漏洞在产品交付后才被发现,增加了修复成本和风险。为了解决这一…...
【JAVA-数据结构】Map和Set
上一篇我们聊到了排序相关内容,这一篇我们对Map和Set进行一系列说明,大家自取。 1.搜索树 1.1 概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节…...
从 0 到 1,用 Python 构建超实用 Web 实时聊天应用
从 0 到 1,用 Python 构建超实用 Web 实时聊天应用 本文深入剖析如何运用 Python 的 Flask 框架与 SocketIO 扩展,搭建一个功能完备的 Web 实时聊天应用。从环境搭建、前后端代码实现,到最终运行展示,逐步拆解关键步骤࿰…...
5分钟掌握CAD_Sketcher:Blender中实现精确参数化设计的终极指南
5分钟掌握CAD_Sketcher:Blender中实现精确参数化设计的终极指南 【免费下载链接】CAD_Sketcher Constraint-based geometry sketcher for blender 项目地址: https://gitcode.com/gh_mirrors/ca/CAD_Sketcher CAD_Sketcher是Blender中基于约束的几何草图工具…...
电源设计新手看过来:手把手教你用SIMPLIS仿真和Matlab拟合,验证自己的环路设计
电源设计新手实战指南:用SIMPLIS与Matlab双剑合璧验证环路稳定性 作为一名刚踏入电源设计领域的新手,最令人头疼的莫过于面对密密麻麻的公式推导后,却无法确定自己设计的补偿网络是否真的能在实际电路中发挥作用。本文将带你用SIMPLIS仿真和M…...
Rust crate 构建与依赖管理
Rust作为一门现代系统编程语言,凭借其出色的性能与安全性吸引了大量开发者。而Rust的模块化设计核心——crate(代码库)的构建与依赖管理,则是每个Rust开发者必须掌握的关键技能。无论是构建小型工具还是大型项目,高效的…...
Qt5离线安装包国内下载失败?别急,用迅雷搞定Windows/Mac/Linux全平台(附完整地址规律)
Qt5离线安装包高效下载指南:跨平台解决方案与URL解析 遇到Qt5离线安装包下载失败时,许多开发者第一反应可能是寻找特殊网络工具,但其实有更简单高效的解决方案。本文将详细介绍如何利用常规下载工具获取Qt5全平台安装包,并解析其U…...
告别命令行!用rosbridge_suite和WebSocket在浏览器里遥控你的ROS机器人(附完整代码)
浏览器操控ROS机器人:rosbridge_suite与WebSocket实战指南 想象一下,你正在开发一个机器人项目,需要频繁测试不同运动指令对机器人行为的影响。每次修改参数都要重新编译、运行命令行,不仅效率低下,还容易打断思路。有…...
ComfyUI Qwen人脸生成图像教程:提示词分层写法,效果更稳定
ComfyUI Qwen人脸生成图像教程:提示词分层写法,效果更稳定 1. 认识Qwen人脸生成模型 1.1 模型核心能力解析 Qwen-Image-Edit-F2P模型是一款专注于从单张人脸生成完整全身图像的专业工具。它不同于普通的图像生成模型,而是专门针对人脸到全…...
IEEE1588v2深度解析:PTP路径时延测量的两种机制对比与应用场景
1. IEEE1588v2与PTP协议基础扫盲 第一次接触IEEE1588v2协议时,我被满屏的"主时钟"、"从时钟"、"透明时钟"这些术语绕得头晕。后来在工业自动化项目里实际调试设备同步时才发现,这套协议就像个隐形的指挥家,让…...
从2D照片到3D场景的终极转换:深度实战fSpy相机匹配工具
从2D照片到3D场景的终极转换:深度实战fSpy相机匹配工具 【免费下载链接】fSpy A cross platform app for quick and easy still image camera matching 项目地址: https://gitcode.com/gh_mirrors/fs/fSpy 你是否曾面对一张建筑照片,想要在3D软件…...
从崩溃地址到问题源码:手把手教你用map文件逆向分析嵌入式程序死机原因
从崩溃地址到问题源码:嵌入式程序死机逆向分析实战指南 1. 嵌入式崩溃分析的核心价值与挑战 当嵌入式设备在现场运行中出现死机时,传统的调试器往往无法直接连接使用。此时,map文件与崩溃地址分析成为工程师最后的救命稻草。这种离线分析方法…...
Flutter图片宽高获取实战:本地与网络图片处理指南
1. Flutter图片宽高获取的核心场景 在移动应用开发中,图片处理是个高频需求。特别是在IM聊天应用里,用户发送的图片需要根据原始尺寸进行等比缩放,否则就会出现变形或者显示不全的问题。我做过一个社交项目,用户上传的图片尺寸千奇…...
