1.类是什么?

在面向对象编程中(OOP)中,一个类顶定义了一个对象的特征。类是定义对象属性和方法的模板,是用来绘制具体对象实例的“蓝图”。

2.类与构造函数的比较

  1. // 构造函数:初始化、添加方法和继承
  2. function Hero(name, level) {
  3. this.name = name;
  4. this.level = level;
  5. }
  6. Hero.prototype.greet = function() {
  7. return `${this.name} say hello`
  8. }
  9. function Mage(name,level, spell) {
  10. Hero.call(this, name, level);
  11. this.spell = spell;
  12. }
  1. // 类:初始化、添加方法和继承
  2. class Hero {
  3. constructor (name, level) {
  4. this.name = name;
  5. this.level = level;
  6. }
  7. greeting() {
  8. return `${this.name} say hello`
  9. }
  10. }
  11. class Mage extends Hero {
  12. constructor(name, level, spell) {
  13. super(name, level);
  14. this.spell = spell;
  15. }
  16. }

ES6 的 class 可以看作一个语法糖,它的绝大部分功能,ES5 都可以做到,新的 class 写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。但值得注意的是,类的内部中所有定义的方法,都是不可枚举的,同时,类在底层还是使用了JS的函数和原型链

3.JS中使用Class的坑

  1. this指向进行确定,当然可以使用bind函数来确定,但当这种方法很多的时候,会显得构造函数非常臃肿;
  2. 使用类属性+箭头函数的方式来定义方法时,该方法不在原型链上,同时每创建一个对象实例将会创建该方法,将会造成性能浪费
  3. 可以利用工厂模式解决


4. class相关的知识点

  1. 一个类中只能存在一个constructor方法
  2. 一个构造函数可以使用super来调用一个父类的构造函数
  3. static:调用静态方法不需要实例化该类,也不能通过该类实例调用静态方法,它通常用于创建工具函数
  4. 当调用静态或原型方法时没有指定this的值,则方法内的值将被设置为undefined

    两篇好文:

    ES6 系列之 Babel 是如何编译 Class 的(上)
    ES6 系列之 Babel 是如何编译 Class 的(下)