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中了。