当前位置: 首页 > 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…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

2023赣州旅游投资集团

单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...

Kafka主题运维全指南:从基础配置到故障处理

#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...