简介
javascript 是一种基于对象的语言,你遇到的所有东西几乎都是对象。但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有 class(类)。
es6 中新提出了类(Class)概念,JavaScript 中的类只是 JavaScript 中的类只是 JavaScript 现有基于原型的继承的一种语法包装(语法糖),他能让我们用建明的语法实现继承。
基本语法
声明一个 Person “类”,它内部有一个 constructor 方法,这个就是构造方法,而 this 关键字则代表实例对象。
使用 new 关键子创建,是跟构造函数的用法完全一致。构造函数和普通的 JavaScript 中的构造函数是一个样的。
1 | // 声明类 |
实例
使用构造函数
1 | //父类 |
构造函数的 prototype(原型)属性,类的所有方法都定义在类的 prototype 属性上面。
1 | class B {} |
子类的使用
可以通过 extends 关键字来实现继承
constructor 方法
一个类必须有 constructor 方法,默认添加。默认返回 this(实例对象),也可指定别的对象。
类必须使用 new 调用,否则会报错。
1 | class Foo { |
类的实例对象
类的所有实例共享一个原型对象。通过实例的proto属性为“类”添加方法。
1 | var oObj = new Person('小明', 20); |
extends
extends 关键词被用在类声明或者类表达式上,以创建一个类是另一个类的子类。
描述
extends 关键词用来创建一个普通类或者内建对象的子类。
扩展的.prototype 必须是一个 Object 或者 null。
使用 extends
1 | //父类 |
使用 extends 扩展内建对象
这个示例继承了 Date 对象。 你可以从实战演示看到这个例子。
1 | class myDate extends Date { |
扩展 null
可以像扩展普通类一样扩展 null,但是新对象的原型将不会继承 Object.prototype.
1 | class nullExtends extends null { |
注意事项
class 表达式
1 | let person = new (class { |
不存在变量提升
1 | new Foo(); // ReferenceError |
class 的取值函数(getter)和存值函数(setter)
与 ES5 一样,在“类”的内部可以使用 get 和 set 关键字,对某个属性设置存值函数和取值函数,拦截该属性的存取行为。
1 | class MyClass { |
Class 的静态方法
类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上 static 关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。
1 | class Foo { |
如果在实例上调用静态方法,会抛出一个错误,表示不存在该方法。
父类的静态方法,可以被子类继承。