JavaScript——JavaScript中的类

141 阅读2分钟

写在前面

一篇技术文章,主要讲解了我在学习过程中对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(),如果不这样程序会报错。

参考文献

《深入理解ES6》第九章 -JavaScript中的类