时间:2021-05-28
在 ES5 中主要是通过构造函数方式和原型方式来定义一个类,但是在 ES6 新引入了 class 关键字,使之具有了正式类的能力,类(class)是ECMAScript 中新的基础性语法糖结构。虽然 ES6 类表面上看起来可以支持正式的面向对象编程,但实际上它背后使用的仍然是原型和构造函数的概念。
使用 ES5 定义一个类并调用
function Person(name, age, job) { this.name = "Totora"; this.age = 19; this.job = "student"; this.sayName = function() { console.log(this.name); };}let person = new Person();person.sayName();使用 ES6 定义一个类并调用
ES6中有两种定义类的方式:类声明和类表达式
class Person { constructor() { this.name = "Totora"; this.age = 19; this.job = "student"; } sayName() { console.log(this.name); }}let person = new Person();person.sayName();//当我们使用typeof检测Person的类型时:console.log(typeof Person); //function,它的本质仍然是函数在调用类时,不管是ES5还是ES6,都必须使用new操作符来进行调用,不可以直接执行。
两者区别在于:
ES5这样调用不会报错,可以正常执行(因为ES5中的类和普通函数几乎没有本质上的区别)
function Person(name, age, job) { this.name = "Totora"; this.age = 19; this.job = "student"; this.sayName = function() { console.log(this.name); };}let person = Person();console.log(person); //undefinedES6会报错
class Person { constructor() { this.name = "Totora"; this.age = 19; this.job = "student"; } sayName() { console.log(this.name); }}let person =Person();console.log(person);person.sayName(); //Class constructor Person cannot be invoked without 'new'通过以下对比可以发现,当用class声明类执行时会报错,说明ES6中用class定义的类无法实现变量提升。
函数受函数作用域的限制,但是类受块作用域的限制
//变量提升let person = new Person()function Person(name, age, job) { this.name = "Totora"; this.age = 19; this.job = "student"; this.sayName = function() { console.log(this.name); };}person.sayName(); //Totoralet person = new Person();class Person { constructor() { this.name = "Totora"; this.age = 19; this.job = "student"; } sayName() { console.log(this.name); }}person.sayName(); // Cannot access 'Person' before initialization类可以包含构造函数方法、实例方法、获取函数、设置函数、静态类的方法。但是空的类定义照样有效
//空类定义class Foo {}//有构造函数的类class Bar { constructor() {}}//有获取函数的类class Baz { get myBaz() {}}//有静态方法的类class Qux { static myQux() {}}可以在类上定义静态方法。静态类成员在类定义中使用static关键字作为前缀,在静态成员中,this引用类自身;
与原型成员类似,静态成员每个类上只能有一个;
static声明的静态属性和方法都可以被子类继承。
class Person { constructor() { //添加到this的所有内容都会存在于不同的实例上 this.locate = () => console.log('instance', this); } //定义在类的原型对象上 locate() { console.log('prototype', this); } //定义在类本身上 static locate() { console.log('class', this); }}let p = new Person();p.locate(); //instance Person { locate: [Function (anonymous)] }Person.prototype.locate(); //prototype {}Person.locate(); //class [class Person]class Person { static name() { this.job(); //此处的this指向类 } static job() { console.log('Totora'); //不会出现在实例中 } job() { console.log('student'); }}Person.name(); //TotoraES5中的继承实质上是先创建子类的实例对象,再将父类的方法添加到this上(Parent.apply(this)),通过原型或构造函数机制来实现
ES6的继承实际上是先创建父类的实例对象this,然后再用子类的构造函数修改this。
ES6中类之间通过extends关键字,就可以继承任何拥有[[Construct]]和原型的对象,在很大程度上,这不仅i仅可以继承一个类,也可以继承普通的构造函数(保持向后兼容)
ES6中派生类的方法可以通过super关键字引用它们的原型,这个关键字只能在派生类中使用,而且仅限于类的构造函数、实例方法和静态方法的内部。在类构造函数中使用super可以调用父类构造函数。
//ES5中的继承function parent(a,b) { this.a = a; this.b = b;}function child(c) { this.c = c;}parent.call(child, 1, 2); //子级来继承父级child.prototype = new parent(1, 2);//ES6中的继承class parent { constructor(a, b) { this.a = a; this.b = b; } parentMethods() { return this.a + this.b }}class child extends parent { constructor(a, b, c) { super(a, b); //通过super调用父类 this.c = c; } childMethods() { return this.c + ',' + super.parentMethods() //通过super实例化调用父类 }}const point = new child(1, 2, 3);console.log(point.childMethods());到此这篇关于ES5和ES6中类区别的文章就介绍到这了,更多相关ES5和ES6类的区别内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言在es5中主要是通过构造函数方式和原型方式来定义一个类,在es6中我们可以通过class来定义类,今天整理一下它们的区别。关于es5中定义类的方式,可以看这
本文实例讲述了ES6中异步对象Promise用法。分享给大家供大家参考,具体如下:回忆一下ES5中的怎么使用异步方法//es5中的异步回调letajax=fun
其实es6的面向对象很多原理和机制还是ES5的,只不过把语法改成类似php和java老牌后端语言中的面向对象语法.一、用es6封装一个基本的类classPers
本文实例讲述了ES6对象操作。分享给大家供大家参考,具体如下:1.对象赋值es5中的对象赋值方式如下:letname="小明";letskill='es6开发'
前言初衷:在面试中,面试官经常问到说一下Es5和Es6的数组方法有哪些,有很多同学老是分不清楚,今天笔者就来分享一下。适合人群:前端初级开发Es5系列index