es5 类与es6中class的区别小结


Posted in Javascript onNovember 09, 2020

前言

在es5中主要是通过构造函数方式和原型方式来定义一个类,在es6中我们可以通过class来定义类,今天整理一下它们的区别。

关于es5中定义类的方式,可以看这一篇Js的‘类',我们这里主要聊es5类和es6中class类的区别。

一、class类必须new调用,不能直接执行。

es5 类与es6中class的区别小结

class类执行的话会报错,而es5中的类和普通函数并没有本质区别,执行肯定是ok的。

二、class类不存在变量提升

es5 类与es6中class的区别小结

es5 类与es6中class的区别小结

图2报错,说明class方式没有把类的定义提升到顶部。

三、class类无法遍历它实例原型链上的属性和方法

function Foo (color) {
 this.color = color
}
Foo.prototype.like = function () {
 console.log(`like${this.color}`)
}
let foo = new Foo()

for (let key in foo) {
 // 原型上的like也被打印出来了
 console.log(key) // color、like
}
class Foo {
 constructor (color) {
  this.color = color
 }
 like () {
  console.log(`like${this.color}`)
 }
}
let foo = new Foo('red')

for (let key in foo) {
 // 只打印一个color,没有打印原型链上的like
 console.log(key) // color
}

四、new.target属性

es6为new命令引入了一个new.target属性,它会返回new命令作用于的那个构造函数。如果不是通过new调用或Reflect.construct()调用的,new.target会返回undefined

function Person(name) {
 if (new.target === Person) {
 this.name = name;
 } else {
 throw new Error('必须使用 new 命令生成实例');
 }
}

let obj = {}
Person.call(obj, 'red') // 此时使用非new的调用方式就会报错

五、class类有static静态方法

static静态方法只能通过类调用,不会出现在实例上;另外如果静态方法包含 this 关键字,这个 this 指的是类,而不是实例。static声明的静态属性和方法都可以被子类继承。

class Foo {
 static bar() {
 this.baz(); // 此处的this指向类
 }
 static baz() {
 console.log('hello'); // 不会出现在实例中
 }
 baz() {
 console.log('world');
 }
}

Foo.bar() // hello

总结

到此这篇关于es5 类与es6中class的区别的文章就介绍到这了,更多相关es5类与es6中class区别内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
制作特殊字的脚本
Jun 26 Javascript
jQuery使用手册之二 DOM操作
Mar 24 Javascript
event.srcElement 用法笔记e.target
Dec 18 Javascript
使用非html5实现js板连连看游戏示例代码
Sep 22 Javascript
jquery动态加载select下拉框示例代码
Dec 10 Javascript
JS实现弹性菜单效果代码
Sep 07 Javascript
跟我学习javascript的隐式强制转换
Nov 16 Javascript
JavaScript学习笔记整理之引用类型
Jan 22 Javascript
设置jQueryUI DatePicker默认语言为中文
Jun 04 Javascript
JavaScript操作 url 中 search 部分方法函数
Jun 15 Javascript
vue.js实现的经典计算器/科学计算器功能示例
Jul 11 Javascript
Vue实现日历小插件
Jun 26 Javascript
vue实现标签云效果的示例
Nov 09 #Javascript
写一个Vue loading 插件
Nov 09 #Javascript
解决Vue大括号字符换行踩的坑
Nov 09 #Javascript
vue data有值,但是页面{{}} 取不到值的解决
Nov 09 #Javascript
vue 防止页面加载时看到花括号的解决操作
Nov 09 #Javascript
Webpack的Loader和Plugin的区别
Nov 09 #Javascript
解决vue初始化项目一直停在downloading template的问题
Nov 09 #Javascript
You might like
《PHP边学边教》(04.编写简易的通讯录――视频教程1)
2006/12/13 PHP
PHP 引用是个坏习惯
2010/03/12 PHP
PHP 数组排序方法总结 推荐收藏
2010/06/30 PHP
Php无限级栏目分类读取的实现代码
2014/02/19 PHP
php数组添加元素方法小结
2014/12/20 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
jqgrid 表格数据导出实例
2013/11/21 Javascript
详解jquery中$.ajax方法提交表单
2014/11/03 Javascript
简介JavaScript中valueOf()方法的使用
2015/06/05 Javascript
简介JavaScript中strike()方法的使用
2015/06/08 Javascript
javascript表格的渲染组件
2015/07/03 Javascript
Bootstrap零基础入门教程(二)
2016/07/18 Javascript
多种方式实现js图片预览
2016/12/12 Javascript
浅谈react受控组件与非受控组件(小结)
2018/02/09 Javascript
微信小程序CSS3动画下拉菜单效果
2018/11/04 Javascript
Windows上node.js的多版本管理工具用法实例分析
2019/11/06 Javascript
深入webpack打包原理及loader和plugin的实现
2020/05/06 Javascript
vue-cli脚手架的.babelrc文件用法说明
2020/09/11 Javascript
Echarts.js无法引入问题解决方案
2020/10/30 Javascript
在Python中实现贪婪排名算法的教程
2015/04/17 Python
python使用multiprocessing模块实现带回调函数的异步调用方法
2015/04/18 Python
python简单读取大文件的方法
2016/07/01 Python
Python实现导出数据生成excel报表的方法示例
2017/07/12 Python
python实现自动发送邮件发送多人、群发、多附件的示例
2018/01/23 Python
python如何定义带参数的装饰器
2018/03/20 Python
pandas中apply和transform方法的性能比较及区别介绍
2018/10/30 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
2019/06/11 Python
python数据预处理 :样本分布不均的解决(过采样和欠采样)
2020/02/29 Python
Python爬虫之爬取淘女郎照片示例详解
2020/07/28 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
公司部门司机岗位职责
2014/01/03 职场文书
幼儿园门卫岗位职责范本
2014/07/02 职场文书
团组织推优材料
2014/12/29 职场文书
关于车尾的标语大全
2015/08/11 职场文书
tensorboard 可视化之localhost:6006不显示的解决方案
2021/05/22 Python
实现AJAX异步调用和局部刷新的基本步骤
2022/03/17 Javascript