ES6 | JavaScript中的类class

9,027 阅读4分钟
原文链接: mp.weixin.qq.com

ES5中的近类结构

ES5以及之前的版本,没有类的概念,但是聪明的JavaScript开发者,为了实现面向对象,创建了特殊的近类结构。

ES5中创建类的方法:新建一个构造函数,定义一个方法并且赋值给构造函数的原型。

ES6 class类

ES6实现类非常简单,只需要类声明。推荐 babel在线测试ES6 测试下面的代码。

类声明

如果你学过java,那么一定会非常熟悉这种声明类的方式。

和ES5中使用构造函数不同的是,在ES6中,我们将原型的实现写在了类中,但本质上还是一样的,都是需要新建一个类名,然后实现构造函数,再实现原型方法。

私有属性是实例中的属性,不会出现在原型上,且只能在类的构造函数或方法中创建,此例的name就是一个私有属性。这里建议你在构造函数中创建所有私有属性,从而只通过一处就可以控制所有的所有私有属性。

定义私有属性,只需要在构造方法中定义this.xx = xx。

值得注意的是:typeof Person 最终返回的结果是“function”

类声明和函数声明的区别和特点

1、函数声明可以被提升,类声明不能提升(与let声明类似)。

2、类声明中的代码自动强行运行在严格模式下。

3、类中的所有方法都是不可枚举的,而自定义类型中,可以通过Object.defineProperty()手工指定不可枚举属性。

4、每个类都有一个[[construct]]的方法。

5、只能使用new来调用类的构造函数。

6、不能在类中修改类名。

类表达式

类有2种表现形式:声明式和表达式。

类是一等公民

JavaScript函数是一等公民,类也设计成一等公民。

1、可以将类作为参数传入函数。

2、通过立即调用类构造函数可以创建单例。

     用new调用类的表达式,紧接着通过一对小括号调用这个表达式。

访问器属性

类支持在原型上定义访问器属性。

尽管应该在类的构造函数中创建自己的属性,但是类也支持直接在原型上定义访问器属性。创建getter时,需要在关键字get 后紧跟一个空格和响应的标识符;创建setter时,只需把关键字get替换为set即可。

可计算成员名称

可计算成员是指使用方括号包裹一个表达式,如下面定义了一个变量m,然后使用[m]设置为类A的原型方法。

生成器方法

回顾一下上一章(参见深入理解ES6第8章)讲的生成器,生成器是一个返回迭代器的函数。在类中,我们也可以使用生成器方法。

这个写法很有趣,我们新增一个原型方法稍微改动一下。

静态成员

静态成员是指在方法名或属性名前面加上static关键字,和普通方法不一样的是,static修饰的方法不能在实例中访问,只能用类名直接访问。

继承与派生类

我们在写react的时候,自定义的组件会继承React.Component。

A叫做派生类,在派生类中,如果使用了构造方法,就必须使用super()。

关于super使用的几点要求:

1、只可以在派生类中使用super。派生类是指继承自其它类的新类。

2、在构造函数中访问this之前要调用super(),负责初始化this。

3、如果不想调用super,可以让类的构造函数返回一个对象。

类方法遮蔽

我们可以在继承的类中重写父类的方法。

静态成员继承

**父类中的静态成员,也可以继承到派生类中。**静态成员继承只能通过派生类访问,不能通过派生类的实例访问。

派生自表达式的类

很好理解,就是指父类可以是一个表达式。

function Rectangle(length, width){

 ......

}

class Square extends Rectangle{

   ......

}

内建对象的继承

有些牛逼的人觉得使用内建的Array不够爽,就希望ECMA提供一种继承内建对象的方法,然后那帮大神们就把这个功能添加到class中了。