携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第26天juejin.cn/post/712312…
类其实是混合模式的语法糖
类名就是以前构造函数的函数名
constructor就相当于是构造函数,传参时就在constructor里接收,并在它里面定义属性。
直接在constructor外面写方法,并且会默认定义在原型身上
注意:里面的{}之间没有逗号,方法必须使用省略写法,new实例和以前写法一样
1. constructor()方法
是类的默认方法,该方法可以省略,就是没办法写实例对象的属性了,但是添加的方法依然存在。该方法返回值是this,return如果返回的是别的对象的话,那么new出来的就是return返回的对象。
2. 类的实例
必须得使用new关键字创建实例,否则会报错。
3. 实例属性的新写法
在ES2022里,确定了类里面没相当于定义一个常量属性。有constructor也可以定义属性,定义在类的内部的最顶层,主要不需要使用var,let,const定义,直接写属性名=值,跟再constructor里写this.属性名=值是一样的。相当于定义一个常量属性。
这种新写法的好处是,所有实例对象自身的属性都定义在类的头部,看上去比较整齐,一眼就能看出这个类有哪些实例属性。
set存值函数:具有拦截功能,在往属性里存值之前进行拦截,会把你传的值,先进行处理,然后再帮你存值。set存值函数会自动帮你处理数据 get取值函数,是在把值取出来之前做了一些事情,再给你返回值。
给属性存值的时候,就会触发set函数
取属性值的时候,得到的是get函数的返回值
这两个函数是定义在了decriptor属性上 类的第一种创建方式 class 类名{} 类的第二种创建方式 const 类名=class 实例对象的名字(可省略){}
静态属性和方法
定义在了类身上的属性和方法都是静态的,实例对象也可以继承静态属性和方法。
私有属性和方法
不能被实例对象继承
ES2022正式为class添加了私有属性,方法是在属性名之前使用#表示。
只能在类的内部使用(this.#count)。如果在类的外部使用,就会报错。
另外,不管在类的内部或外部,读取一个不存在的私有属性,也都会报错。这跟公开属性的行为完全不同,如果读取一个不存在的公开属性,不会报错,只会返回undefined。
类的注意点
严格模式
类和模块的内部,默认就是严格模式,所以不需要使用use strict指定运行模式。只要你的代码写在类或模块之中,就只有严格模式可用。考虑到未来所有的代码,其实都是运行在模块之中,所以 ES6 实际上把整个语言升级到了严格模式。
不存在提升
类不存在变量提升(hoist),这一点与 ES5 完全不同。