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 相关文章推荐
写了一个layout,拖动条连贯,内容区可为iframe
Aug 19 Javascript
项目实践之javascript技巧
Dec 06 Javascript
FireFox与IE 下js兼容触发click事件的代码
Nov 20 Javascript
Whatever:hover 无需javascript让IE支持丰富伪类
Jun 29 Javascript
ExtJS4中使用mixins实现多继承示例
Dec 03 Javascript
jquery预览图片实现鼠标放上去显示实际大小
Jan 16 Javascript
将form表单中的元素转换成对象的方法适用表单提交
May 02 Javascript
原生JS实现旋转木马式图片轮播插件
Apr 25 Javascript
javascript加减乘除的简单实例
Jul 12 Javascript
js注册时输入合法性验证方法
Oct 21 Javascript
vue的一个分页组件的示例代码
Dec 25 Javascript
vue-test-utils初使用详解
May 23 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语法(4)
2006/10/09 PHP
PHP自定义大小验证码的方法详解
2013/06/07 PHP
php判断数组中是否存在指定键(key)的方法
2015/03/17 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
2017/03/28 PHP
php基于环形链表解决约瑟夫环问题示例
2017/11/07 PHP
JavaScript 基于原型的对象(创建、调用)
2009/10/16 Javascript
在网站上应该用的30个jQuery插件整理
2011/11/03 Javascript
checkbox勾选判断代码分析
2014/06/11 Javascript
Node.js的特点和应用场景介绍
2014/11/04 Javascript
浅谈轻量级js模板引擎simplite
2015/02/13 Javascript
移动Web中图片自适应的两种JavaScript解决方法
2015/06/18 Javascript
基于JQuery实现仿网易邮箱全屏动感滚动插件fullPage
2015/09/20 Javascript
javascript实现拖动元素交换位置
2015/11/29 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
2016/08/08 Javascript
NodeJs测试框架Mocha的安装与使用
2017/03/28 NodeJs
为你的微信小程序体积瘦身详解
2017/05/20 Javascript
基于JavaScript实现多级菜单效果
2017/07/25 Javascript
webpack中的热刷新与热加载的区别
2018/04/09 Javascript
react-navigation之动态修改title的内容
2018/09/26 Javascript
webpack中如何使用雪碧图的示例代码
2018/11/11 Javascript
AjaxFileUpload.js实现异步上传文件功能
2019/04/19 Javascript
详解Vue中的自定义指令
2020/12/07 Vue.js
python删除过期文件的方法
2015/05/29 Python
Python实现获取照片拍摄日期并重命名的方法
2017/09/30 Python
详解Django+uwsgi+Nginx上线最佳实战
2019/03/14 Python
Python实现平行坐标图的绘制(plotly)方式
2019/11/22 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
2020/06/22 Python
修复iPhone的safari浏览器上submit按钮圆角bug
2012/12/24 HTML / CSS
使用css3做0.5px的细线的示例代码
2018/01/18 HTML / CSS
html5定位获取当前位置并在百度地图上显示
2014/08/22 HTML / CSS
香港彩色隐形眼镜在线商店:Stunninglens(全球免费送货)
2019/05/10 全球购物
校园招聘策划书
2014/01/09 职场文书
用人单位终止解除劳动合同证明书
2014/10/06 职场文书
普通党员整改措施
2014/10/24 职场文书
LayUI+Shiro实现动态菜单并记住菜单收展的示例
2021/05/06 Javascript
Linux中sftp常用命令整理
2022/06/28 Servers