1.1 类定义

1
2
// 类声明
class Person {} //类声明不能提升,且收块级作用域限制

类的构成包含构造函数方法、实例方法、获取函数、设置函数和静态类方法,空的类一样有效。

1
2
3
4
5
6
7
8
9
10
class Foo { } //空类有效
class Foo {
constructor() {} //构造函数
}
class Foo {
get myBaz() {} //有获取函数
}
class Qux {
static myQux() {} //有静态方法
}

类可以看做是一个特殊函数。并且有显式原型prototype,该原型也有一个constructor指向自身。并且类也可以用instanceof检查是否存在于实例的原型链中。

1.2 类构造函数

new一个类的操作如下

  1. 在内存中创建一个新对象
  2. 这个新对象内部的[[Prototype]]指针被赋值为构造函数的prototype属性
  3. 构造函数内部的this被赋值为这个新对象
  4. 执行构造函数内部的代码(给新对象添加属性)
  5. 如果构造函数返回非空对象,则返回该对象;否则返回刚创建的新对象

实例化类,如果不需要参数,括号可免。

类构造函数与普通构造函数的区别是:
1.类构造函数必须使用new,普通构造函数不使用new则默认以全局的this为对象
2.不使用new调用类构造函数会抛出错误

1.3 实例、原型和类成员

实例成员不会在原型上共享,并且可以给实例继续添加新成员。
在类块中定义的所有内容都定义在类的原型上。类块中不能定义成员数据(类定义外部可以手动添加成员数据)。
类支持获取和设置访问器,与普通对象一样,设置属性,重写get,set方法。

1.4 类继承

使用extends关键字实现继承。可以继承类和普通的构造函数。
在类当中调用super相当于调用构造函数,传入参数需要手动传入。
如果没有定义类构造函数,实例化时会自动调用super。
类会继承内置类型。

1.5 小结

工厂模式就是一个简单的函数,这个函数可以创建对象,为它添加属性和方法,然后返回这个对象。这个模式在构造函数模式出现后就很少用了。
ES6新增的类是基于现有原型机制的语法糖。类的语法让开发者可以优雅地定义向后兼容的类,既可以继承内置类型,也可以自定义类型。类有效地跨越了对象实例、对象原型和对象类之间的鸿沟。