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 相关文章推荐
奉献给JavaScript初学者的编写开发的七个细节
Jan 11 Javascript
用jquery和json从后台获得数据集的代码
Nov 07 Javascript
js+HTML5实现视频截图的方法
Jun 16 Javascript
RequireJS入门一之实现第一个例子
Sep 30 Javascript
JS延时提示框实现方法详解
Nov 26 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
Sep 04 Javascript
浅析JS中对函数function的理解(基础篇)
Oct 14 Javascript
用自定义图片代替原生checkbox实现全选,删除以及提交的方法
Oct 18 Javascript
微信小程序 input输入及动态设置按钮的实现
Oct 27 Javascript
nuxt框架中路由鉴权之Koa和Session的用法
May 09 Javascript
Vue中的字符串模板的使用
May 17 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
Aug 07 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中使用XML
2006/10/09 PHP
IIS下配置Php+Mysql+zend的图文教程
2006/12/08 PHP
windows环境下php配置memcache的具体操作步骤
2013/06/09 PHP
PHP高手需要要掌握的知识点
2014/08/21 PHP
PHP实现腾讯短网址生成api接口实例
2020/12/08 PHP
JQUERY复选框CHECKBOX全选,取消全选
2008/08/30 Javascript
kmock javascript 单元测试代码
2011/02/06 Javascript
禁止拷贝网页内容的js代码
2014/01/22 Javascript
Jquery实现鼠标移动放大图片功能实例
2015/03/25 Javascript
jquery遍历标签中自定义的属性方法
2016/09/17 Javascript
[js高手之路]HTML标签解释成DOM节点的实现方法
2017/08/31 Javascript
JS去掉字符串中所有的逗号
2017/10/18 Javascript
webpack 插件html-webpack-plugin的具体使用
2018/04/09 Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
2018/09/29 Javascript
Vuex 模块化使用详解
2019/07/31 Javascript
Vue解析带html标签的字符串为dom的实例
2019/11/13 Javascript
原生js实现下拉选项卡
2019/11/27 Javascript
原生JavaScript实现换肤
2021/02/19 Javascript
[02:04]2016国际邀请赛中国区预选赛VG.R晋级之路
2016/07/01 DOTA
Python获取网页上图片下载地址的方法
2015/03/11 Python
python模块之StringIO使用示例
2015/04/08 Python
python实现爬取千万淘宝商品的方法
2015/06/30 Python
Python实现查找系统盘中需要找的字符
2015/07/14 Python
python中的错误处理
2016/04/10 Python
python 采集中文乱码问题的完美解决方法
2016/09/27 Python
Python中static相关知识小结
2018/01/02 Python
python 模拟银行转账功能过程详解
2019/08/06 Python
Champion澳大利亚官网:美国冠军运动服装
2018/05/07 全球购物
阿里巴巴Oracle DBA笔试题答案-备份恢复类
2013/11/20 面试题
Java面试题:说出如下代码的执行结果
2015/10/30 面试题
外语专业毕业生自我评价分享
2013/10/05 职场文书
商业用房租赁协议书
2014/10/13 职场文书
感恩节寄语2015
2015/03/24 职场文书
校园运动会广播稿
2015/08/19 职场文书
2016年基层党支部书记公开承诺书
2016/03/25 职场文书
python实现web邮箱扫描的示例(附源码)
2021/03/30 Python