ES6--》读懂JS中—Class类

news/2024/5/2 16:49:50/文章来源:https://blog.csdn.net/qq_53123067/article/details/127142797

目录

Class类

初识class

class中getter和setter设置

表达式方式书写

静态属性与静态方法

私有属性和私有方法

class继承

静态属性和方法继承

私有属性和方法继承

class显示原型与隐式原型关系


Class类

ES6提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰,更像面向对象编程的语法。

初识class

之前ES5通过构造函数实现实例化的方法

<script>// 定义人类function People(name,age){this.name = namethis.age = age}// 添加方法People.prototype.say = function (){console.log('hello world');}// 实例化方法let person = new People('张三',18)person.say()//hello worldconsole.log(person);//People {name: '张三', age: 18}
</script>

ES6 class 方法实现

constructor()方法是类的默认方法,通过 new 命令生成对象实例时,自动调用该方法,一个类必须有constructor()方法,如果没有显示定义,一个空的constructor()方法会被默认添加。

<script>// classclass People {// 构造方法 名字是固定格式不能修改constructor(name,age){this.name = namethis.age = age}// 方法必须使用该语法,不能使用 ES5 的对象完整形式say(){console.log('hello world');}}// 实例化对象let person = new People('张三',18)person.say()//hello worldconsole.log(person);//People {name: '张三', age: 18}
</script>

class中getter和setter设置

在ES6中,类的内部可以使用 getter (取值函数) 和 setter (存值函数) 关键字,即 get 和 set ,对某个属性设置取值函数和存值函数,拦截该函数的存取行为。

<script>class People {get name(){console.log('我是张三');return '这是我的名字'//如果不写return,默认是undefined}set name(Name){//形参必须有console.log('我的名字被修改了');}}// 实例化对象let p = new People()// 只要读取 p 的实例化属性,就会执行 get 关键字函数里面代码,而且这个函数的返回值就是属性的一个值console.log(p.name);// 只要对 name 属性进行一个修改,如果有set关键字函数,就会执行该函数p.name = 'f'
</script>

表达式方式书写

和函数一样,类可以用表达式定义书写,需要注意的是:定义的类名只能在Class内部使用,指代当前类,在Class外部,类只能用自己定义等于类的常量。

<script>const myClass = class Me {getClass(){return Me.name//返回类名}}let c = new myClass()console.log(c.getClass())//MeMe.name//Me is not defined // 如果类的内部没用到的话,可以省略Me,也就是可以写成下面的形式const MyClass = class {};
</script>

静态属性与静态方法

静态属性是指 Class 本身的属性,即 Class.propName,而不是定义在实例对象 this 上的属性。

实例对象和函数对象的属性是不相通的,实例对象的属性和构造函数的原型对象相通,实例对象只能继承构造函数原型中的属性和方法。

<script>function People(){}// 函数属性和方法People.name = '张三'People.say = function(){console.log('hello world');}// 原型对象属性和方法People.prototype.age = 18// 实例化对象let p = new People()console.log(People.name,People.say());console.log(p.age);console.log(p.name,p.say());
</script>

以class方法展示,因为ES6明确规定,Class内部只有静态方法,没有静态属性,而要想得到设置静态属性,需要在实例属性前面加上 static 关键字;静态方法也要加上 static 关键字,表示该方法不会被实例继承,而是直接通过类来调用。

<script>class People {// 静态属性static name = '张三'static say(){console.log('hello world');}}let p = new People()console.log(p.name);//undefinedconsole.log(People.name);//张三
</script>

私有属性和私有方法

常见需求:私有属性和方法,是只能在类内部访问的属性和方法,外部不能访问,有利于代码的封装。

ES6中正式为class添加了私有属性和方法,方法是在属性和方法名之前使用 # 表示,如果不带 # ,会被当作另一个属性和方法。

<script>class person {// 私有属性#nameconstructor(name){this.#name = name}// 私有方法#sayName(){return this.#name}result(){console.log(this.#name);}}let p = new person()p.result = '张三'console.log(p);//person {result: '张三', #sayName: ƒ, #name: undefined}p.#name//报错
</script>

当我们想判断某个类的私有属性是否存在时,我们可以用 in 运算符进行判断。

<script>class A {#foo = 0;m() {console.log(#foo in this); // trueconsole.log(#bar in this); // Private field '#bar' must be declared in an enclosing class(提示我们:私有字段“#bar”必须在封闭类中声明)}}let a = new A()a.m()
</script>

class继承

构造函数实现继承

通过原型链进行继承,如果有不熟悉原型链的朋友,可以看一下我之前的文章:原型和原型链

<script>// 动物function Animals(name,age){this.name = namethis.age = age}Animals.prototype.call = function(){console.log('我是动物');}// 狗function Dog(name,age,color,gender){// 改变this的指向,继承父类Animals.call(this,name,age)this.color = colorthis.gender = gender}// 设置子类构造函数的原型Dog.prototype = new Animals //此时子类的实例对象就会继承父类上面的方法Dog.prototype.constructor = Dog// 声明子类的方法Dog.prototype.say = function(){console.log('汪汪汪!!!');}// 子类对象进行实例化const d = new Dog('小明',3,'棕色','雄')console.log(d);
</script>

class类实现继承

class可以通过 extends 关键字实现继承,让子类继承父类属性和方法,可以看出 extends 的写法比上文 原型链继承 清晰方便的多。

<script>class Animals {// 构造方法constructor(name,age){this.name = namethis.age = age}// 父类成员的属性call(){console.log('我是动物');}}class Dog extends Animals {// 构造方法constructor(name,age,color,gender){// 调用父类方法,需要用super(),super()就是父类的constructor()方法super(name,age)this.color = colorthis.gender = gender}// 子类独有的方法say(){console.log('汪汪汪!!!');}// 当子类和父类重名时,优先调用的是子类的方法call(){console.log('我也是动物');// 如果想调用父类方法,使用如下语句:super.父类方法()super.call()}}// 实例化子类对象const d = new Dog('小明',3,'棕色','雄')console.log(d);d.call()d.say()
</script>

super 关键字

上面代码用到 super 这个关键字,这里简单说明一下:子类继承父类的 constructor() 构造函数中必须要有 super(),代表调用父类的构造函数,没有就会报错,super虽然代表父类的构造函数,但是返回的是子类的实例,即super内部的this指的是子类的实例。作为函数时,super() 只能用在子类的构造函数中,用在其他地方就会报错。

判断继承是否存在

Object.getPrototypeOf()方法可以用来从子类上获取父类,所以可以用来判断一个类是否继承另一个类。

<script>class people {}class boy extends people {}console.log(Object.getPrototypeOf(boy) === people);//true
</script>

静态属性和方法继承

父类的静态属性和方法也能被子类继续,如下:

<script>class people {// 父类静态属性 属性为数值static age = 18// 父类静态属性 属性为对象static h = {height:180}// 父类静态方法static say(){console.log('hello world');}}// 子类继承父类class boy extends people {constructor(){// 调用父类的构造函数super()// boy类继承静态属性时,会采用浅拷贝,拷贝父类静态属性的值,因此people.age和boy.age是两个彼此独立的属性。boy.age--// 如果父类的静态属性的值是一个对象,那么子类的静态属性也会指向这个对象,因为浅拷贝只会拷贝对象的内存地址所以,子类修改这个对象的属性值,会影响到父类。boy.h.height--}}// 实例化子类let b = new boy()boy.say()console.log(people.age);console.log(boy.age);console.log(boy.h.height);console.log(people.h.height);console.log(b);
</script>

私有属性和方法继承

私有属性和方法只能定义在它本身的class里面使用,所以子类会继承父类所有的属性和方法除了私有属性和方法,那么如何让子类访问到父类中的私有属性和方法呢?如果父类定义了私有属性的读写方法,子类就可以通过这些方法,读取私有属性。

<script>class people {#name = '张三'// 定义用来读取私有属性和方法的函数getName(){return this.#name}}class boy extends people {constructor(){// 调用父类的构造函数super()console.log(this.getName());//张三}}let b = new boy()
</script>

class显示原型与隐式原型关系

每个对象都有隐式原型 __proto__ 属性,指向对应的构造函数的显示原型 prototype 属性,class作为构造函数的语法糖,同时也具有 prototype 属性和 __proto__ 属性,所以存在两条继承链。当然这里这做一个了解。

<script>class people {}class boy extends people{}// 子类的__proto__属性,表示构造函数的继承,总是指向父类。console.log(boy.__proto__ === people); // true// 子类prototype属性的__proto__属性,表示方法的继承,总是指向父类的prototype属性。console.log(boy.prototype.__proto__ === people.prototype); // true
</script>

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

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

相关文章

脚本学习:1

今天所学的就俩个案例。 1.用脚本实现,鼠标移动到我的淘宝显示菜单&#xff0c;移除菜单隐藏 基本思路通过display来控制 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>脚本示例</title>&l…

03 NLP-神经网络基础常识复习3-梯度的推导和反向传播的实现

计算图的介绍结束了&#xff0c;下面我们来实现一些实用的层。这里&#xff0c;我们将实现Sigmoid层、全连接层,Affine层和Softmax with Loss层。 1.Sigmoid层 sigmoid函数由 表示&#xff0c; sigmoid函数的导数由下式表示 Sigmoid层的计算图可以绘制成如下图。这里&#x…

PWM实验(控制蜂鸣器,风扇,马达)

cortex-A7核实现PWM对蜂鸣器&#xff0c;风扇&#xff0c;马达的控制 1.PWM概念 PWM为一种对模拟信号电平进行数字编码的方法&#xff0c;通过高分辨率计数器的使用&#xff0c;方波的占空比被调制用来对一个具体模拟信号的电平进行编码。 A7核的芯片有控制PWM的脉冲宽度调制定…

【设计模式】-创建型模式-第2章第4讲-【原型模式】

目录 1、原型模式&#xff08;Prototype Pattern&#xff09;概念 2、浅拷贝与深拷贝 2.1、概念 2.2、Java 中的深浅拷贝 浅拷贝&#xff1a; 深拷贝&#xff1a; 实例 浅拷贝 深拷贝的两种实现方式 方式一 方式二 3、原型模式的优缺点 4、 结尾 1、原型模式&#…

带你一步步分析webpack是如何执行打包产物的

引入关系如图所示&#xff1a; 圈出来文件d是异步导入的文件。 wepback版本如图所示&#xff1a; 执行打包命令&#xff0c;产物如下图&#xff1a; 会生成两个js文件&#xff0c;一个是入口文件打包的testxx.js&#xff0c;还有一个是异步文件d生成的src_d_js.js。 打包后的…

CSS学习298~355(品优购+Web服务器)

1 品优购项目规划 1.1 网站制作流程 我们主要做前台页面设计 1.2 品优购项目整体介绍 项目名称: 品优购项目描述:品优购是一个电商网站,我们要完成PC端首页、列表页、注册页面的制作 1.3 品优购项目的学习目的 电商类网站比较综合,里面需要大量的布局技术,包括布局方式、…

数据结构-复杂度(深入学习版+Java版)

文章目录一、复杂度经典例子分析1、计算时间复杂度分析题1&#xff1a;O(NM)&#xff0c;循环题2&#xff1a;O(N^2)&#xff0c;冒泡排序题3&#xff1a;O(logN)&#xff0c;二分查找题4&#xff1a;O(N)&#xff0c;阶乘递归题5&#xff1a;O(2^N)&#xff0c;斐波那契递归(满…

ffmpeg、ffplay、ffprobe 常用命令详解(音视频必备)

前言&#xff1a; &#x1f604;作者简介&#xff1a;小曾同学.com,小伙伴们也可以叫我小曾&#xff0c;一个致力于测试开发的博主⛽️ 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;…

回溯算法 - 二叉树中和为某一值的路径 字符串的排列

目录 1.二叉树中和为某一值的路径 1.1 题目描述 1.2 回溯算法的一般步骤 1.3 解题思路 1.4 代码实现 2. 字符串的排列 2.1 题目描述 2.2 解题思路 2.3 代码实现 1.二叉树中和为某一值的路径 1.1 题目描述 输入一颗二叉树的根节点root和一个整数expectNumber&#xff…

华为模拟器ensp学习笔记

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 目录前言1️⃣如何注册eNSP设备?2️⃣如何通过SecureCRT登录eNSP模拟设备&#xff1f;结语前言 记录华为模拟器使用中遇到的问题 1️⃣如何注册eNSP设备? 如何注册eNSP设备 重新注册AR、WLAN设备&#xff1a; 启动AR时&…

模块化:CommonJS规范

目录 CommonJS规范 模块使用环境区分 核心语法 如何使用 CommonJS&#xff1a;服务器端使用 CommonJS&#xff1a;浏览器端使用 CommonJS规范 模块使用环境区分 CommonJS规范中&#xff0c;每一个JS文件都可以作为一个模块。模块的引入&#xff0c;主要区分两个环境&…

基于Java后台(Springboot框架)+前端小程序(MINA框架)+Mysql数据库的医院预约挂号小程序系统设计与实现

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于微信小程序医院预约挂号系统&#xff0c;前台用户使用小程序&#xff0c;后台管理使用基JavaMySql技术&#xff1b;通过后台设置医院信息、录入医院科室信息、录入医生信息、设置医生排班信息、查看预约…

(附源码)计算机毕业设计SSM毕业设计管理系统

毕设帮助&#xff0c;指导&#xff0c;本源码分享&#xff0c;调试部署(见文末) 3.3功能需求分析 本系统采用从上往下的步骤开发&#xff0c;基本功能如下&#xff1a; 本课题要求实现一套毕业设计管理系统&#xff0c;系统主要包括&#xff08;管理员&#xff0c;教师和学生&a…

python-pyecharts基础知识

资料来源&#xff1a;2022新版黑马程序员python教程&#xff0c;8天python从入门到精通&#xff0c;学python看这套就够了_哔哩哔哩_bilibili 折线图 地图 动态GDP增长图 补充知识&#xff1a; json 1&#xff09;JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去…

群晖Docker套件注册Harbor私有镜像仓库,并下载运行自己发布的Docker镜像

[群晖Docker套件注册Harbor私有镜像仓库&#xff0c;并下载运行自己发布的Docker镜像] 在进行微服务开发时&#xff0c;一些基础服务组件&#xff08;Nacos、Redis、Mysql&#xff09;的运行以及越来越多的业务服务组件的开发&#xff0c;会导致开发者电脑的内存资源紧张&#…

Android:玩转Jetpack Compose之MVI架构——基类中使用页面UiState

系列文章目录 架构一&#xff08;MVP&#xff09;&#xff1a;Android:玩转RetrofitOkHttpKotlin协程 网络请求架构 架构二&#xff08;MVVM&#xff09;&#xff1a;Android:玩转网络请求架构 RetrofitKotlin协程简单使用(MVVM架构模式) 架构三&#xff08;MVI&#xff09;&a…

吴恩达machine-learning-specialization2022第1周的optional lab

1. 使用python和numpy实现一个线性回归 要求使用梯度下降法&#xff0c;可视化losslossloss随着迭代次数的变化曲线 2. 说明 2.1 拟合函数 fw,b(x(i))wx(i)bf_{w,b}(x^{(i)})wx^{(i)}bfw,b​(x(i))wx(i)b 2.2 均方误差损失函数 J(w,b)12m∑i0m−1(fw,b(x(i))−y(i))2J(w,b)…

【云原生丨Kubernetes系列15】创建 ConfigMap 资源对象

前言 前⾯我们深入学习了 Servie 的使⽤&#xff0c; Service 是 Kubernetes 系统中⾮常重要的⼀个核⼼概念&#xff0c;这节课我们来学习另外⼀个⾮常重要的资源对象&#xff1a; ConfigMap 文章目录前言引入创建引入 应用部署的一个最佳实践是将应用所需的配置信息与程序进行…

【ML13】overfitting and underfitting 过拟合与欠拟合

过拟合与欠拟合过拟合与欠拟合概念过拟合解决办法解决办法一&#xff1a;在训练集中加入更多数据解决办法二&#xff1a;优化数据集 feature selection解决方法三&#xff1a;正则化 Regularization正则化线性回归Recape of Cost Function of Linear RegressionAdd the regular…

算法刷题:可交换的连续最大和

目录前言1. 题目描述2. 题目分析3. 代码实现4. 运行测试后记前言 好久没有做题了&#xff0c;前两天做了一道题&#xff0c;感觉还比较有意思&#xff0c;来分享一下。想学习&#xff0c;但是自己实在是懒&#xff0c;懒癌怎么治&#xff1f;期待着自己彻底奋发图强那一天。 …