写在前面
一篇技术文章,主要讲解了我在学习过程中对ES6中的类的理解。
简介
大多数的面向对象的语言都支持类和继承的概念,但是基于原型的JavaScript从出生起就不太一样,它只能通过其他方法定义并关联多个相似的对象。这种情况从ES1持续到ES5。尽管有一部分开发者坚持JavaScript不需要类,但是由于给JavaScript添加类的库层出不穷,最终在ES6引入了类的概念。JavaScript的类在实现上与其他的面向对象的语言不太一样,其语法设计借鉴了JavaScript的动态性。
那么在ES6出现之前,开发者是如何实现类的呢?
- 在ES5及其早期版本中没有类的概念,大家实现的思路是创建一个自定义类型:首先创建一个构造函数,然后定义其他方法并赋值给构造函数的原型。如下:
// ES5的近似类的结构
function PersonType() {
this.name = name
}
PersonType.prototype.sayName = function() {
console.log(this.name)
}
ES6中类
类的声明
class PersonClass {
construct(name) {
this.name = name
}
sayName() {
console.log(this.name)
}
}
类表达式
let PersonClass = class {
construct(name) {
this.name = name
}
sayName() {
console.log(this.name)
}
}
ES6中类的特点
- 类声明与let声明类似,不可以提升;真正执行声明语句之前,它们会一直存在于临时死区。
- 类声明中的所有代码自动运行在严格模式下,且无法改变。
- 在类中,所有方法都是不可枚举的。即
enumerable: false - 每个类都有名为
[[construct]]的内部方法,通过关键字 new 调用不含[[construct]]的方法会导致抛出错误。 - 使用除 new 关键字以外的方式调用类的构造函数会导致抛出错误。
- 在类中修改类名会导致程序报错。
- JavaScript中的类也是一等公民。
- 类可以通过
extends实现继承,继承自其他类的类被称作派生类,如果在派生类中指定了构造函数则必须要调用super(),如果不这样程序会报错。
参考文献