1. 概述
ES6 提供了更接近语言的写法,引入了Class(类)这个概念,作为对象的模版。
通过class关键字,可以定义类。基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面对对象编程的语法而已。
2. 声明调用
语法:
<script>
class Person {
//构造方法
constructor(name, age) {
this.name = name;
this.age = age;
}
eat() {
console.log('我会吃饭');
}
}
let me = new Person('xy', 20);
me.eat();
</script>
通过class+类名构造类,其中有个构造方法constructor,这是类中的特殊方法,当类实例化后自动调用。
方法声明写在构造方法之外
3. 类的本质
在ES6之前,我们都是通过构造函数+原型实现面向对象编程。
在ES6之后,我们通过类来实现面向对象编程
类的本质其实还是一个函数,我们也可以简单的认为,类就是构造函数的另一种写法
我们知道构造函数有以下特点:
- 构造函数具有原型对象prototype
- 构造函数原型对象prototype里面有constructor指向构造函数本身
- 构造函数可以通过原型对象添加方法
- 构造函数创建的实例对象有__proto__对象原型指向构造函数的原型对象
带着以上特点我们去看类
<script>
class Person {
}
// 1. 构造函数具有原型对象prototype
console.log(Person.prototype);
// 2. 构造函数原型对象prototype里面有constructor指向构造函数本身
console.log(Person.prototype.constructor);
// 3. 构造函数可以通过原型对象添加方法
Person.prototype.eat = function () {
console.log('hello');
}
// 4. 构造函数创建的实例对象有__proto__对象原型指向构造函数的原型对象
var xy = new Person;
console.log(xy.__proto__);
</script>
显示结果:
4. 类的继承
类的继承通过 extends 关键字实现,子类通过 super 方法获得父类属性。
如下:子类通过extends继承父类,通过super方法继承name、age属性。
<script>
class Father {
constructor(name, age) {
this.name = name;
this.age = age;
}
eat() {
console.log('我会吃饭');
}
}
class Son extends Father {
constructor(name, age, sex) {
super(name, age);
this.sex = sex;
}
game() {
console.log('我会玩游戏');
}
}
let xy = new Son('xy', 20, '男');
console.log(xy);
</script>
ES6的继承使得代码更清晰容易理解,这里可对照ES5的继承实现
5. 对父类方法的重写
在子类中直接声明一个与父类同名函数即可进行重写,如:
<script>
class Father {
constructor(name, age) {
this.name = name;
this.age = age;
}
eat() {
console.log('我会吃饭');
}
}
class Son extends Father {
constructor(name, age, sex) {
super(name, age);
this.sex = sex;
}
game() {
console.log('我会玩游戏');
}
eat() {
console.log('我会吃零食');
}
}
let xy = new Son('xy', 20, '男');
xy.eat();
</script>