ES5 的构造函数和 ES6 的类有什么区别
文章目录
- 语法不同
- 方法定义方式不同
- 继承方式不同
- 类内部的this指向不同
- 静态成员定义方式不同
- 访问器属性
- 类的类型检查
在JavaScript中,类和构造函数都被用来创建对象,接下来会从以下几点说说两者的区别:
语法不同
- 构造函数使用函数来定义
- 类使用class关键字来定义
ES6 的class
可以看作是一个语法糖,这种写法只是让对象原型的写法更加清晰、更像面向对象编程的语法。
比如这是一个构造函数生成实例对象的例子,
function Point(x, y) {this.x = x;this.y = y;
}
Point.prototype.toString = function () {return '(' + this.x + ', ' + this.y + ')';
};
var p = new Point(1, 2);
console.log(p.toString()) // (1, 2)
上面的代码用类来改写是这样的,
class Point {constructor(x, y) {this.x = x;this.y = y;}toString() {return '(' + this.x + ', ' + this.y + ')';}
}
var p = new Point(1, 2);
console.log(p.toString()) // (1, 2)
所以类完全可以看作构造函数的另一种写法,
class Point {// ...
}
typeof Point // "function"
Point === Point.prototype.constructor // true
类的数据类型就是函数,类本身就指向构造函数。
方法定义方式不同
- 构造函数的方法都是定义在构造函数的原型上,即原型上的方法被所有实例共享
- 类的方法可以直接定义在类中,也可以定义在类的原型上,而且定义在类中的方法是不可枚举的。
构造函数的
prototype
属性,在 ES6 的“类”上面继续存在。事实上,类的所有方法都定义在类的prototype
属性上面。
class Point {constructor() {// ...}toString() {// ...}toValue() {// ...}
}
// 等同于
Point.prototype = {constructor() {},toString() {},toValue() {},
};
以下代码表明类的内部所有定义的方法,都是不可枚举的(non-enumerable)
class Point {constructor(x, y) {// ...}toString() {// ...}
}
Object.keys(Point.prototype) // []
Object.getOwnPropertyNames(Point.prototype) // ["constructor","toString"]
而直接定义在原型上的都是可枚举的
class Point {constructor(x, y) {this.x = x;this.y = y;}toString() {return '(' + this.x + ', ' + this.y + ')';}
}
Point.prototype.toString1 = function() {// ...
};console.log(Object.keys(Point.prototype)) // [ 'toString1' ]
console.log(Object.getOwnPropertyNames(Point.prototype)) // [ 'constructor', 'toString', 'toString1' ]
继承方式不同
- 构造函数通过将一个构造函数作为另一个构造函数的原型,实现原型链继承,可以实现单继承和多继承。
- 类通过extends关键字来实现继承,支持单继承,子类继承父类的属性和方法,可以调用父类的构造函数。
构造函数的继承需要手动处理原型链,并确保构造函数和原型的正确指向,以下示例可看出
function Animal(name) {this.name = name;
}Animal.prototype.eat = function() {console.log(this.name + ' is eating.');
};function Dog(name, breed) {Animal.call(this, name); // 调用父类构造函数this.breed = breed;
}Dog.prototype = Object.create(Animal.prototype); // 设置子类的原型对象
Dog.prototype.constructor = Dog; // 重设构造函数指向自身Dog.prototype.bark = function() {console.log(this.name + ' is barking.');
};const dog = new Dog('Buddy', 'Golden Retriever');
dog.eat(); // 输出: Buddy is eating.
dog.bark(); // 输出: Buddy is barking.
类的继承示例
class Animal {constructor(name) {this.name = name;}eat() {console.log(`${this.name} is eating.`);}
}class Dog extends Animal {constructor(name, breed) {super(name); // 调用父类构造函数this.breed = breed;}bark() {console.log(`${this.name} is barking.`);}
}const dog = new Dog('Buddy', 'Golden Retriever');
dog.eat(); // Buddy is eating.
dog.bark(); // Buddy is barking.
需要注意的是,子类必须在constructor
方法中调用super
方法,否则新建实例时会报错。这是因为子类自己的this
对象,必须先通过父类的构造函数完成塑造,得到与父类同样的实例属性和方法,然后再对其进行加工,加上子类自己的实例属性和方法。如果不调用super
方法,子类就得不到this
对象。
如果子类没有定义constructor
方法,这个方法会被默认添加,代码如下。也就是说,不管有没有显式定义,任何一个子类都有constructor
方法。
class Dog extends Animal {
}
// 等同于
class Dog extends Animal {constructor(...args) {super(...args);}
}
另一个需要注意的地方是,在子类的构造函数中,只有调用super
之后,才可以使用this
关键字,否则会报错。这是因为子类实例的构建,基于父类实例,只有super
方法才能调用父类实例。
class Animal {constructor(name) {this.name = name;}
}
class Cat extends Animal {constructor(name, color) {this.color = color; // ReferenceErrorsuper(name);this.color = color; // 正确}
}
类内部的this指向不同
- ES5中,类内部函数中的
this
指向调用函数的对象 - ES6中,类内部方法中的
this
指向实例对象
注意:如果静态方法中包含this关键字,这个this指的是类,而不是实例。
class Foo {static classMethod() {return 'hello';}}Foo.classMethod() // 'hello'
var foo = new Foo();
foo.classMethod()
// TypeError: foo.classMethod is not a function
静态成员定义方式不同
- ES5中,静态成员需要通过给构造函数手动添加属性或方法来实现
function Person(name, age) {this.name = name;this.age = age;
}Person.staticMethod = function() {console.log("This is a static method.");
};
- ES6中,可以使用static关键字定义静态属性或方法
class Person {constructor(name, age) {this.name = name;this.age = age;}static staticMethod() {console.log("This is a static method.");}
}
访问器属性
- ES6中引入了getter和setter方法,可以使用get和set关键字定义访问器属性。
class Person {constructor(name, age) {this._name = name;this._age = age;}get name() {return this._name;}set name(value) {this._name = value;}
}var person = new Person("Tom", 20);
console.log(person.name); // 输出 "Tom"
person.name = "Jerry";
console.log(person.name); // 输出 "Jerry"
在上述例子中,通过getter和setter方法定义了name访问器属性,可以通过person.name进行属性的访问和修改。
类的类型检查
- ES5中,可以使用
instanceof
运算符来判断对象的类型
instanceof
运算符通过检查对象的原型链来确定对象是否是某个构造函数的实例。它会逐级向上查找对象的__proto__
(或prototype
)属性,直到找到与指定构造函数的prototype
属性相等的对象或到达原型链的末尾。如果找到了相等的对象,则返回true
,否则返回false
。
function Person() {}
var person = new Person();
console.log(person instanceof Person); // 输出 true
- ES6中,可以使用
typeof
运算符来判断类的类型
class Person {}
var person = new Person();
console.log(typeof person); // 输出 "object"
console.log(typeof Person); // 输出 "function"
在上述例子中,typeof person
返回object
,typeof Person
返回function
,可以看出,在ES6中类的类型也是object
,类本身的类型是function
。
相关文章:
ES5 的构造函数和 ES6 的类有什么区别
文章目录 语法不同方法定义方式不同继承方式不同类内部的this指向不同静态成员定义方式不同访问器属性类的类型检查 在JavaScript中,类和构造函数都被用来创建对象,接下来会从以下几点说说两者的区别: 语法不同 构造函数使用函数来定义类使用…...
AUTOSAR配置与实践(配置篇) 如何条件控制PDU外发
AUTOSAR配置与实践(配置篇)如何条件控制PDU外发 一、需求1.1 需求简要分析1.2 需求进一步分析二、流程实现和具体配置一、需求 需要针对特定的PDU(外发)进行条件控制,这里要通过不同配置字进行PDU是否外发的控制 1.1 需求简要分析 正常PDU分组时分为两组,接收报文组和…...
2023年湖北中级工程师职称申报专业有哪些?甘建二告诉你
中级职称职称申报专业:环境工程、 土木建筑、土建结构、土建监理、土木工程、岩石工程、岩土、土岩方、风景园林、园艺、园林、园林建筑、园林工程、园林绿化、古建筑园林、工民建、工民建安装、建筑、建筑管理、建筑工程、建筑工程管理、建筑施工、建筑设计、建筑装…...
记录:ubuntu20.04+ORB_SLAM2_with_pointcloud_map+ROS noetic
由于相机实时在线运行需要ROS,但Ubuntu22.04只支持ROS2,于是重装Ubuntu20.04。上一篇文章跑通的是官方版本的ORB_SLAM2,不支持点云显示。高翔修改版本支持RGB-D相机的点云显示功能。 高翔修改版本ORB_SLAM2:https://github.com/ga…...
文心问数Sugar Bot :大模型+BI,多轮会话自动生成可视化图表与数据结论
Sugar BI 的文心问数功能是基于大语言模型实现的,支持您使用自然语言,通过多轮会话的方式,获取实时数据的图表展现,也可以自动为您总结与图表相关的业务结论。 文心问数功能邀测中,欢迎CSDN的用户前来报名:…...
21、WEB漏洞-文件上传之后端黑白名单绕过
目录 前言验证/绕过 前言 关于文件上传的漏洞,目前在网上的常见验证是验证三个方面: 后缀名,文件类型,文件头,其中这个文件头是属于文件内容的一个验证 后缀名:黑名单,白名单 文件类型…...
windows的django项目部署到linux的docker上
编辑dockerfile文件,可以自行寻找相关教程 创建镜像 docker bulid -t imagename:tag .查看镜像 docker images 如果想自己先试一下,那就需要运行容器 docker run -it -d -p 8000:8000 --name volume_name imagename:tag 查看容器 docker ps -a 进…...
【力扣】70. 爬楼梯 <动态规划>
【力扣】70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. …...
数据结构(3)
线性表是多个具有相同特征的数据的有限序列。 前驱元素:A在B前面,称A为B的前驱元素。 后继元素:B在A后面,称B为A的后继元素。 线性表特征: 1.一个元素没有前驱元素,就是头结点; 2.最后一个…...
深入浅出Pytorch函数——torch.nn.init.xavier_uniform_
分类目录:《深入浅出Pytorch函数》总目录 相关文章: 深入浅出Pytorch函数——torch.nn.init.calculate_gain 深入浅出Pytorch函数——torch.nn.init.uniform_ 深入浅出Pytorch函数——torch.nn.init.normal_ 深入浅出Pytorch函数——torch.nn.init.c…...
优橙内推安徽专场——5G网络优化(中高级)工程师
可加入就业QQ群:801549240 联系老师内推简历投递邮箱:hrictyc.com 内推公司1:浙江省邮电工程建设有限公司 内推公司2:北京宜通华瑞科技有限公司 内推公司3:浙江明讯网络技术有限公司 浙江省邮电工程建设有限公司 …...
2023年计算机设计大赛国三 数据可视化 (源码可分享)
2023年暑假参加了全国大学生计算机设计大赛,并获得了国家三等奖(国赛答辩出了点小插曲)。在此分享和记录本次比赛的经验。 目录 一、作品简介二、作品效果图三、设计思路四、项目特色 一、作品简介 本项目实现对农产品近期发展、电商销售、灾…...
工业生产全面感知!工业感知云来了
面向工业企业数字化转型需求,天翼物联基于感知云平台创新能力和5G工业物联数采能力,为客户提供工业感知云服务,包括工业泛协议接入、感知云工业超轻数采平台、工业感知数据治理、工业数据看板四大服务,构建工业感知神经系统新型数…...
Lnton羚通关于Optimization在【PyTorch】中的基础知识
OPTIMIZING MODEL PARAMETERS (模型参数优化) 现在我们有了模型和数据,是时候通过优化数据上的参数来训练了,验证和测试我们的模型。训练一个模型是一个迭代的过程,在每次迭代中,模型会对输出进行猜测&…...
冒泡排序算法
//version 1 void bubblesort(vector<int>& nums){int n=nums.size();for(int i...
无人机航管应答机 ping200XR
产品概述 ping200XR是一个完整的系统,旨在满足航管应答器和自动相关监视广播(ADS-B)的要求,在管制空域操作无人航空系统(UAS)。该系统完全可配置为模式A,模式C,模式S转发器和扩展ADS-B发射机的任何组合。ping200XR包括一个精度超…...
oracle归档日志满了导致启动不起来解决
oracle启动不起来解决 原因:闪回归档区的空间满了 [oraclepre-oracle ~]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.4.0 Production on Tue Aug 22 14:48:50 2023Copyright (c) 1982, 2013, Oracle. All rights reserved.Connected to: Oracle Database 11g…...
高等数学:线性代数-第二章
文章目录 第2章 矩阵及其运算2.1 线性方程组和矩阵2.2 矩阵的运算2.3 逆矩阵2.4 Cramer法则 第2章 矩阵及其运算 2.1 线性方程组和矩阵 n \bm{n} n 元线性方程组 设有 n 个未知数 m 个方程的线性方程组 { a 11 x 1 a 12 x 2 ⋯ a 1 n x n b 1 a 21 x 1 a 22 x 2 ⋯ a …...
星戈瑞分析FITC-PEG-Alkyne的荧光特性和光谱特性
欢迎来到星戈瑞荧光stargraydye!小编带您盘点: FITC-PEG-Alkyne的荧光特性和光谱特性是对其荧光性能进行分析的方面。以下是FITC-PEG-Alkyne的一些常见荧光特性和光谱特性: **1. 荧光激发波长:**FITC-PEG-Alkyne的荧光激发波长通…...
VB.NET调用VB6 Activex EXE实现PowerBasic和FreeBasic的标准DLL调用
VB6写的ActiveX EXE公共对象是外置进程,因此,尽管它是x86 32位的进程,但可以集成到 VB.NET的x64和x32程序中使用。 VS2022的VB.NET程序,调用ActiveX DLL对象我在上篇笔记中写了 VB.NET通过VB6 ActiveX DLL调用PowerBasic及FreeB…...
深入了解Unity的Physics类:一份详细的技术指南(七)(下篇)
接着上一篇深入了解Unity的Physics类(上篇),我们继续把Physics类剩余的属性和方法进行讲解 碰撞检测和忽略: (这些方法和属性涉及查询和处理物体之间的碰撞) Physics.CheckBox: 检查给定位置的盒子是否与任何碰撞器接触或者位于任何碰撞器内部。 Physics.CheckCapsu…...
C++入门:引用是什么
目录 1.引用的概念 2.引用的特征 3.常引用 4.引用使用场景 5.传值,传引用效率比较 6.引用与指针的区别 1.引用的概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空 间,它和它引用…...
2023年人工智能与自动化控制国际学术会议(AIAC 2023)
2023年人工智能与自动化控制国际学术会议(AIAC 2023) The 2023 International Conference on Artificial Intelligence and Automation Control 2023年人工智能与自动化控制国际学术会议(AIAC 2023)将于2023年10月27-29日在中…...
分布式核心知识以及常见微服务框架
分布式中的远程调用 在微服务架构中,通常存在多个服务之间的远程调用的需求。远程调用通常包含两个部分:序列化和通信协议。常见的序列化协议包括json、xml、 hession、 protobuf、thrift、text、 bytes等,目前主流的远程调用技术有基于HTTP…...
Unity记录4.1-存储-根据关键字加载Tile
文章首发见博客:https://mwhls.top/4810.html。 无图/格式错误/后续更新请见首发页。 更多更新请到mwhls.top查看 欢迎留言提问或批评建议,私信不回。 汇总:Unity 记录 摘要:实现完 Tilemap 地图生成后,实现根据关键字…...
数据结构—树表的查找
7.3树表的查找 当表插入、删除操作频繁时,为维护表的有序表,需要移动表中很多记录。 改用动态查找表——几种特殊的树 表结构在查找过程中动态生成 对于给定值key 若表中存在,则成功返回; 否则࿰…...
微信小程序测试策略和注意事项?
一、测试前准备(环境搭建) 1、前端页面 微信 Web 开发者工具安装、授权测试用的微信号可预览和调试小程序 2、管理后台 配置内网测试服务器环境,通过 PC 端 Web 站点管理小程序前端的输出内容,可从开发人员获取管理账号进行测…...
VUE3封装EL-ELEMENT-PLUS input组件
VUE3封装EL-ELEMENT-PLUS input组件 完整代码 <template><div><div><div class"lable_top" v-if"label"><label :class"lable_sty">{{ label }}</label></div><el-inputv-model"inputValue&…...
RISC-V公测平台发布 · 在SG2042上配置Jupiter+Octave科学计算环境
简介 JupyterHub是一个开源的共享计算平台,它为每个用户管理一个单独的 Jupyter 环境, 可以用于学生班级、企业数据科学小组或科学研究小组。它是一个多用户中心,可以生成、管理和代理多个单用户Jupyter笔记本服务器的实例。 GNU Octave是一…...
初识Sentinel
目录 1.解决雪崩的方式有4种: 1.1.2超时处理: 1.1.3仓壁模式 1.1.4.断路器 1.1.5.限流 1.1.6.总结 1.2.服务保护技术对比 1.3.Sentinel介绍和安装 1.3.1.初识Sentinel 1.3.2.安装Sentinel 1.4.微服务整合Sentinel 2.流量控制 2.1.簇点链路 …...
网站访问量大/搜索引擎案例分析结论
在上一部分,我们完成了数据库的一部分安装,下面接着来安装。检查Oracle的环境变量,确保PATH中包括/u01/app/oracle/product/10.2.0/db_1/bin执行dbca命令,会弹出数据库配置助理界面。点击“Next”进入下一个界面。这里选择创建数据…...
做门名片设计网站/google seo是什么
前言: js通过元素id获取元素及元素值的方法 document.getElementById("元素的id"); //找到该id元素的对象 document.getElementById("元素的id").value;的value值 下面就开始吧 一、客户端处理(即前端处理) //声明变量,用于保存异步传输对象XML…...
公司网站制作高端/营销软文范例500
转自:雅利安人有多强悍?灭掉三个文明古国,为何败在中国脚下 (baidu.com)这个民族民风彪悍;这个民族曾一度将四大文明古国中的三个——古埃及、古印度、古巴比伦尽数消灭;这个民族甚至被称为“文明粉碎机”;…...
广告设计公司名称/重庆seo整站优化效果
实际上,百度官方已经有明确说法,不建议url中放置汉字,某些时候蜘蛛无法解析此类网址,就会影响网站的seo优化结果,详情如下: 从事SEO职业的人都知道页面URL的处理是优化过程中一个非常重要组成部分ÿ…...
旅游网站 源码 织梦/博客seo教程
实现call Function.prototype.myCall function (targetObj, ...resule) {// 判断传入对象的有无targetObj targetObj || window;// 向传入对象上挂在this指向,此时this指向调用myCall函数targetObj.fn this;// 在内部使用传入对象调用fn方法,这样可以…...
做视频教育网站/无锡seo公司找哪家好
HTTPS和HTTP的区别主要如下: 1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。 2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。 3、http和https使用的是完全不…...