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

基础知识|原型在什么时候用和类的区别

在 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 共享方法默认在类的原型上共享(但语法更加简洁)
继承机制使用 prototypeObject.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 最终形成文件&#xff1a…...

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 实时聊天应用。从环境搭建、前后端代码实现,到最终运行展示,逐步拆解关键步骤&#xff0…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes&#xff0…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

cd /home 进入home盘 安装虚拟环境&#xff1a; 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境&#xff1a; virtualenv myenv 3、激活虚拟环境&#xff08;激活环境可以在当前环境下安装包&#xff09; source myenv/bin/activate 此时&#xff0c;终端…...

Java中栈的多种实现类详解

Java中栈的多种实现类详解&#xff1a;Stack、LinkedList与ArrayDeque全方位对比 前言一、Stack类——Java最早的栈实现1.1 Stack类简介1.2 常用方法1.3 优缺点分析 二、LinkedList类——灵活的双端链表2.1 LinkedList类简介2.2 常用方法2.3 优缺点分析 三、ArrayDeque类——高…...