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 相关文章推荐
JQuery判断子iframe何时加载完成解决方案
Aug 20 Javascript
简单的代码实现jquery定时器
Nov 17 Javascript
表格奇偶行设置不同颜色的核心JS代码
Dec 24 Javascript
JavaScript中创建字典对象(dictionary)实例
Mar 31 Javascript
基于javascript实现图片预加载
Jan 05 Javascript
jQuery基于函数重载实现自定义Alert函数样式的方法
Jul 27 Javascript
BootStrap实现轮播图效果(收藏)
Dec 30 Javascript
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
Feb 06 Javascript
深入理解JavaScript中的for循环
Feb 07 Javascript
vue中element组件样式修改无效的解决方法
Feb 03 Javascript
vue+element+Java实现批量删除功能
Apr 08 Javascript
Node.js API详解之 dns模块用法实例分析
May 15 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.MVC的模板标签系统(五)
2006/09/05 PHP
PHP提取数据库内容中的图片地址并循环输出
2010/03/21 PHP
php cache类代码(php数据缓存类)
2010/04/15 PHP
PHP获取数组的键与值方法小结
2015/06/13 PHP
[原创]php使用curl判断网页404(不存在)的方法
2016/06/23 PHP
php curl中gzip的压缩性能测试实例分析
2016/11/08 PHP
PHP解耦的三重境界(浅谈服务容器)
2017/03/13 PHP
PHP封装的完整分页类示例
2018/08/21 PHP
几个比较经典常用的jQuery小技巧
2010/03/01 Javascript
JavaScript编程中布尔对象的基本使用
2015/10/25 Javascript
JavaScript数据操作_浅谈原始值和引用值的操作本质
2016/08/23 Javascript
jquery实现左右滑动式轮播图
2017/03/02 Javascript
js常用的继承--组合式继承
2017/03/06 Javascript
微信小程序tabbar不显示解决办法
2017/06/08 Javascript
vue组件name的作用小结
2018/05/23 Javascript
layui 表格的属性的显示转换方法
2018/08/14 Javascript
vue-rx的初步使用教程
2018/09/21 Javascript
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
2018/09/25 Javascript
vue 解除鼠标的监听事件的方法
2019/11/13 Javascript
Vue实现按钮级权限方案
2019/11/21 Javascript
[02:46]2014DOTA2国际邀请赛 选手为你解读比赛MVP充满梦想
2014/07/09 DOTA
Django中Model的使用方法教程
2018/03/07 Python
python write无法写入文件的解决方法
2019/01/23 Python
Python函数式编程指南:对生成器全面讲解
2019/11/19 Python
Python3实现将一维数组按标准长度分隔为二维数组
2019/11/29 Python
使用pandas库对csv文件进行筛选保存
2020/05/25 Python
python 牛顿法实现逻辑回归(Logistic Regression)
2020/10/15 Python
Python爬虫之Selenium中frame/iframe表单嵌套页面
2020/12/04 Python
详解python中的异常捕获
2020/12/15 Python
Styleonme中文网:韩国高档人气品牌
2017/06/21 全球购物
制衣厂各岗位职责
2013/12/02 职场文书
《她是我的朋友》教学反思
2014/04/26 职场文书
2014年施工员工作总结
2014/11/18 职场文书
求职导师推荐信范文
2015/03/27 职场文书
2016教师给学生的毕业寄语
2015/12/04 职场文书
2016国庆节67周年红领巾广播稿
2015/12/18 职场文书