持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情
ES6中新增了class的定义方法,原先我们是通过function的形式来创建类的,现在通过class就跟接近面向对象的写法了,可以说妥妥的像java,为啥只是像呢?因为其还是和java中的类有细微的差别的。
静态方法
ES6中的类新增了static方法,,用于我们声明静态方法:

如图我们就创建了一个类的静态方法,注意静态方法和普通方法的区别,静态方法是属于类的,而普通方法是属于实例的,所以我们一般也把类中的方法叫实例方法,所以静态方法可以在不通过new实例就可以进行调用。浅学过java的同学知道,java不仅有静态方法,还有静态属性,但是在类中是不存在静态方法的。在es6之前是没有静态属性的,在es7的时候推出了静态属性写法就是直接static+属性名。需要注意的是静态方法在使用的时候只能通过类名调用,实例是不拥有这个方法的,静态方法将被共享这样有利于内存的减少,但是在静态函数中还是存在this的,且this的指向就是类本身。

可以看到输出的this就是类本身,而当我们试图用实例调用该函数的时候就会进行报错。
私有属性
ES还没有对private进行实现,所谓是有私有就是该方法或者属性只能用于类的内部,不能被外部的使用。不能被继承。虽然ES还没有实现但是我们可以自己进行模拟实现,网上主要的方法就是通过weakmap和symbol来进行实现。
首先我们要了解下什么是WeakMap,其和Map其实是类似的,都是对键值对类型的数据进行存储,但是它对键有要求,就是它的键只能是引用数据类型,不能是基本数据类型,而且其不能进行迭代来进行访问weakmap的所有数据。至于symbol在之前的文章已经有所介绍,其表示的是一个独一无二的值,当其作为属性名的时候,该属性不能被for in所遍历得到。

这种实现方式还是有缺点的就是形式不太不符合我们的平常认知,我们正常应该通过this. 的形式来进行访问属性的,但是这里只能通过weakmap的实例名来了。那我们再来看看symbol的实现方式:

可以看到这种实现方式就很符合我们的认知了,虽然不是通过点的形式取得属性,但是通过[]的形式其实是等价的了。但是缺点就是不能做到完全的私有,如我们可以通过reflect。wonKey()来获取所有的属性,从而从外部来访问该属性。
