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 相关文章推荐
前端开发部分总结[兼容性、DOM操作、跨域等](持续更新)
Mar 04 Javascript
jquery $.each 和for怎么跳出循环终止本次循环
Sep 27 Javascript
在线一元二次方程计算器实例(方程计算器在线计算)
Dec 22 Javascript
JavaScript中消除闭包的一般方法介绍
Mar 16 Javascript
浅析jQuery事件之on()方法绑定多个选择器,多个事件
Apr 27 Javascript
基于JavaScript实现树形下拉框
Aug 10 Javascript
jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果
Feb 15 Javascript
jquery实现折叠菜单效果【推荐】
Mar 08 Javascript
对angularJs中ng-style动态改变样式的实例讲解
Sep 30 Javascript
webpack常用配置总览(小结)
Nov 18 Javascript
Vue 禁用浏览器的前进后退操作
Sep 04 Javascript
vue3中轻松实现switch功能组件的全过程
Jan 07 Vue.js
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
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
2012/10/24 PHP
CodeIgniter图像处理类的深入解析
2013/06/17 PHP
php 判断服务器操作系统的类型
2014/02/17 PHP
PHP实现的分解质因数操作示例
2018/08/01 PHP
对php 判断http还是https,以及获得当前url的方法详解
2019/01/15 PHP
CL vs ForZe BO5 第一场 2.13
2021/03/10 DOTA
js改变img标签的src属性在IE下没反应的解决方法
2013/07/23 Javascript
js触发onchange事件的方法说明
2014/03/08 Javascript
JavaScript随机生成信用卡卡号的方法
2015/04/07 Javascript
Javascript实现鼠标框选操作  不是点击选取
2016/04/14 Javascript
判断数组是否包含某个元素的js函数实现方法
2016/05/19 Javascript
Vue+Flask实现简单的登录验证跳转的示例代码
2018/01/13 Javascript
js正则取值的结果数组调试方法
2018/10/10 Javascript
jQuery实现倒计时功能完整示例
2020/06/01 jQuery
[38:40]2018DOTA2亚洲邀请赛 4.6淘汰赛 mineski vs LGD 第一场
2018/04/10 DOTA
[01:12:40]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第三场 1月25日
2021/03/11 DOTA
python分割和拼接字符串
2013/11/01 Python
python海龟绘图实例教程
2014/07/24 Python
Python端口扫描简单程序
2016/11/10 Python
Python调用微信公众平台接口操作示例
2017/07/08 Python
Django 添加静态文件的两种实现方法(必看篇)
2017/07/14 Python
PyQt5每天必学之日历控件QCalendarWidget
2018/04/19 Python
Python实现字符串的逆序 C++字符串逆序算法
2020/05/28 Python
对Python中9种生成新对象的方法总结
2018/05/23 Python
详解Python 数据库的Connection、Cursor两大对象
2018/06/25 Python
Python八皇后问题解答过程详解
2019/07/29 Python
Python基于time模块表示时间常用方法
2020/06/18 Python
python如何修改文件时间属性
2021/02/05 Python
美国最大的在线水培用品商店:GrowersHouse.com
2018/08/14 全球购物
美国沃尔玛网上超市:Walmart
2020/08/14 全球购物
面向对象概念面试题(.NET)
2016/11/04 面试题
企业管理专业个人求职信范文
2013/09/24 职场文书
中专生的个人自我评价
2013/12/11 职场文书
高校师德师风自我剖析材料
2014/09/29 职场文书
2016廉洁教育心得体会
2016/01/20 职场文书
JS新手入门数组处理的实用方法汇总
2021/04/07 Javascript