js Class的概念及其应用场景

含义:类是用来创建对象的模板。
了解类概念之前最好了解以下的知识:

  • 懂点闭包
  • 构造函数
  • 原型

JS和其他语言不同,它是没有Class的,它本质就是JS的构造函数封装的语法糖。ES6提供一种更为清晰的方式来遵循面向对象的编程方式。

首先我们要了解JS的构造函数:

注:构造函数一般都以大写字母开头

/**
*    Demo内部定义的方法,可以防止全局命名空间的污染,因为所有方法都是在构造函数中定义的。
*/
function Demo(name, age) {this.name = name;this.age = age;
}const demo1 = new Demo('张三', 23);/**
*  给自定义构造函数的添加方法,此时构造函数就属于原型
*/Demo.prototype.message = function(){console.log(this.name, this.age)
}

JS类

“语法糖”意味着该语言不是新功能并不是真正的新功能,算是改进机制。类构造允许为程序员定义具有干净语法的基于原型的类。

class Demo2 {constructor(name, age) {this.name = name;this.age = age;}message() {console.log(this.name, this.age)}
}const demo2 = new Demo('李四', 34);
demo2.message(); // 李四34

注:

  • 如果没有“new”运算符,则无法调用类构造函数
  • 类中不能存在多个构造函数
  • 在对象创建期间,第一步是使用一组特定的初始属性和值运行“构造函数”方法
  • 如果类中不存在“构造函数”,那么生成的就是一个空函数。然后你可以在创建的对象上执行其他实现的方法
  • 类内的代码自动处于严格模式

关于class 的继承和super关键字

继承:extends关键字去实现继承。
super是用于继承父类后,获取父类中的构造方法的。
为什么要使用super关键字,这也是因为es6和es5的继承机制有很大的不同。ES5 的继承机制,是先创造一个独立的子类的实例对象,然后再将父类的方法添加到这个对象上面,即“实例在前,继承在后”。ES6 的继承机制,则是先将父类的属性和方法,加到一个空的对象上面,然后再将该对象作为子类的实例,即“继承在前,实例在后”。这就是为什么 ES6 的继承必须先调用super()方法,因为这一步会生成一个继承父类的this对象,没有这一步就无法继承父类。
参考:阮一峰ES6 Class 继承
注:这里的super虽然代表了父类的构造函数,但是因为返回的是子类的this(即子类的实例对象),所以super内部的this代表子类的实例,而不是父类的实例,这里的super()相当于A.prototype.constructor.call(this)(在子类的this上运行父类的构造函数)。

class Parent {constructor(name, age) {this.name = name;this.age = age;}message() {console.log(this.name, this.age)}
}const parent = new Parent('李四', 34);
parent.message()/**1. 此类继承于Demo2类,继承关键字:extends*/
class Child extends Parent {/**2. 以下的super关键字,用来表示父类的构造函数*/constructor(name, age, color) {super(name, age); // 调用父类的constructor内的name, age/**3. 在子类中,如果不先调用super,就使用this则会报错,原因就在于es6的继承机制与es5*/this.color = color}getMessage() {console.log(`我是${this.name},我今年${this.age},我喜欢${this.color}`)/**4. 调用父类的message*/super.message()}
}
const child = new Child('王五', 34, '红色');
child.getMessage()

注:关于class的什么静态、私有等概念省略,需要去看下阮一峰的详细class概念

很多面试官也会问到js类的使用场景:

  1. 大概念:类用来创建可重用组件、状态管理和行为。一般用于定义组件、封装功能、以及创建模块化、可维护的代码。
  2. 我自己的工作场景中:除使用js插件需要用new关键字这些以外,我如果不使用react的提供的一些钩子,例如useReducer【useReducer:管理状态更新逻辑从事件处理函数中移动到组件外面(人话就是:用来统一组织管理不同的事件状态,例如:右击的菜单可能会有,复制、粘贴、选中、转发等 功能,那我们可以统一用一个函数,在函数里面进行不同状态下的处理)】,我就会使用class进行状态管理,用于封装方法的复用性,降低耦合。也是为了在迭代时,不影响其他同事的代码,去增加自己的代码功能。还有就是用来做“封装”。

自我理解:虽然目前我们用现成的UI框架、JS插件、JS数据处理的方法也好,但这些都是别人处理好的,底层还都是建立在JS Class去将封装的代码形式去处理数据。但是!只用Class这个概念是无法真正掌握到核心的,需要搭配设计模式,与其说是设计模式,其本质就是通过一种工程建筑的思维去思考如何将自己的代码复用,如何增强可读性,增强可维护性!在代码中,我们应该追求极简和代码洁癖的编码思维去编写优雅的代码。

参考:
class MDN
阮一峰 ES6 class
freeCodeCamp class

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/783171.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录 Day25 216.组合总和III 17.电话号码的字母组合

216.组合总和III class Solution { private:vector<vector<int>> result; // 存放结果集vector<int> path; // 符合条件的结果// targetSum&#xff1a;目标和&#xff0c;也就是题目中的n。// k&#xff1a;题目中要求k个数的集合。// sum&#xff1a;已经收…

哥本哈根Major后steam搬砖该何去何从?

都在问我哥本哈根major比赛过后市场会不会崩盘呢&#xff1f;说实话&#xff0c;我是不喜欢预测市场的&#xff0c;其实是没那个本事而已。若真有这个预测市场走势的本事&#xff0c;我还用坐在这里每天苦哈哈的搬砖吗&#xff1f;我直接干囤卡囤号的倒卖生意岂不早发财了&…

宝塔面板与1Panel的详细对比分析

在当今的服务器管理领域&#xff0c;宝塔面板和1Panel都是备受欢迎的管理工具。它们各自具有独特的特点和优势&#xff0c;同时也存在一些局限性。本文将从多个维度对比这两款产品&#xff0c;帮助用户根据自身需求做出更合适的选择。 宝塔面板 优点 易用性&#xff1a;宝塔…

九州金榜|孩子厌学应该怎么引导?

孩子厌学&#xff0c;这是许多家长都可能面临的问题。对于这个问题&#xff0c;我们首先要明白&#xff0c;厌学并非孩子的错&#xff0c;而是他们在成长过程中所遇到的一种困境。那么&#xff0c;作为家长&#xff0c;我们应该如何引导他们走出这个困境呢&#xff1f;下面九州…

深入浅出:探索Hadoop生态系统的核心组件与技术架构

目录 前言 HDFS Yarn Hive HBase Spark及Spark Streaming 书本与课程推荐 关于作者&#xff1a; 推荐理由&#xff1a; 作者直播推荐&#xff1a; 前言 进入大数据阶段就意味着 进入NoSQL阶段&#xff0c;更多的是面向OLAP场景&#xff0c;即数据仓库、BI应用等。 …

【博弈论——2探究纳什均衡】

1.纳什均衡 纳什均衡&#xff08;Nash Equilibrium&#xff09;&#xff0c;由美国数学家约翰纳什&#xff08;John Nash&#xff09;提出&#xff0c;是博弈论中的一个重要概念&#xff0c;用来描述在一个非合作博弈中&#xff0c;各个参与者在考虑了其他所有参与者策略的前提…

proteus+keil5仿真学习笔记(补充章 特殊功能寄存器上)

补充章 特殊功能寄存器上 目录 前言 一、布局 二、功能介绍 运算器 1.B寄存器 B Register 2.累加器ACC Accumulator Register 3.程序状态寄存器PSW Program State Word 中断系统 4.中断优先级控制寄存器IP Interrupt Priority Register 5.中断允许控制寄存器IE Interrupt Enabl…

分享 | 顶刊高质量论文插图配色(含RGB值及16进制HEX码)(第三期)

第三期顶刊绘图配色分享来啦&#xff01;这一期做的细心了一点&#xff0c;把双色配色、三色配色、四色配色、多色配色分开展示&#xff0c;大家用起来会更方便一点&#xff1a; 这次还是用之前写了一个多小时的提取论文图片颜色并得出RGB值和16进制码并标注在原图的代码&…

探索c++:string常用接口 迷雾

个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 一、string类 这里我们对string类进行一个简单的总结&#xff1a; string是表示字符串的字…

矩阵间关系的建立

参考文献 2-D Compressive Sensing-Based Visually Secure Multilevel Image Encryption Scheme 加密整体流程如下: 我们关注左上角这一部分: 如何在两个图像之间构建关系,当然是借助第3个矩阵。 A. Establish Relationships Between Different Images 简单说明如下: …

R语言 | 上下双向柱状图

1. 效果图 2. 代码 # 生成测试数据 difdata.frame(labelspaste0("pathway", 1:3),upc(30,15,1),downc(10,20,40) ) rownames(dif)dif$labels dif#变形 difreshape2::melt(dif) dif# 绘图 ggplot(dif, aes(xlabels, yifelse(variable"up", value, -value), …

react 面试题(2024 最新版)

1. 对 React 的理解、特性 React 是靠数据驱动视图改变的一种框架&#xff0c;它的核心驱动方法就是用其提供的 setState 方法设置 state 中的数据从而驱动存放在内存中的虚拟 DOM 树的更新 更新方法就是通过 React 的 Diff 算法比较旧虚拟 DOM 树和新虚拟 DOM 树之间的 Chan…

阅读laserMapping.cpp

ROS_ASSERT(meas.lidar ! nullptr); 这段C代码的含义是检查ROS框架中的lidar数据是否为空。如果lidar数据为空&#xff0c;直接返回&#xff0c;不再执行后续代码。这个检查通常用于确保在进行进一步操作之前&#xff0c;已经正确地获取了lidar数据。 实现原理&#xff1a;在C…

EMF相关学习文档

EMF文档 开始本教程之前学习“What every Eclipse developer should know about EMF”。 EMF概述论文 What every Eclipse developer should know about EMFEMF Book: Eclipse Modeling Framework, Second EditionEMF Book: Eclipse Modeling Framework, First EditionEMF F…

vue路由重定向

在 Vue.js 中&#xff0c;使用 Vue Router 进行路由重定向是一种常见需求。重定向意味着当用户访问一个特定的路由时&#xff0c;他们将被自动导航到另一个路由。这通常用于处理旧的 URL&#xff0c;或者当用户访问首页时重定向到登录页面等场景。 要在 Vue Router 中设置重定…

单例设计模式(3)

单例模式&#xff08;3&#xff09; 实现集群环境下的分布式单例类 如何理解单例模式中的唯一性&#xff1f; 单例模式创建的对象是进程唯一的。以springboot应用程序为例&#xff0c;他是一个进程&#xff0c;可能包含多个线程&#xff0c;单例代表在这个进程的某个类是唯一…

ROS 2边学边练(6)-- 何为参数(parameters)

概念 这一知识点&#xff0c;应该很好理解&#xff0c;参数就是节点的属性&#xff0c;比如猫科动物&#xff0c;它所拥有的属性&#xff08;参数&#xff09;有胡子、能伸缩的爪子、随光线缩放自如的瞳孔、夜视能力、优秀的弹跳力、萌等等。ROS节点中参数支持的数据类型有整型…

Springboot中的三层架构

我们在进行前后端交互的时候&#xff0c;会分为数据访问&#xff0c;业务逻辑&#xff0c;接受请求并响应数据三个操作&#xff0c;这三部分其实是可以拆分的&#xff0c;让他们解耦&#xff0c;否则代码复用性差并且不易维护&#xff0c;所以诞生了三层架构——1.Dao(数据访问…

VuePress基于 Vite 和 Vue 构建优秀框架

VitePress 是一个静态站点生成器 (SSG)&#xff0c;专为构建快速、以内容为中心的站点而设计。简而言之&#xff0c;VitePress 获取用 Markdown 编写的内容&#xff0c;对其应用主题&#xff0c;并生成可以轻松部署到任何地方的静态 HTML 页面。 VitePress 附带一个用于技术文档…