导言
在原生的JS里面,没有类这个概念,他是ES5封装的函数,从本质上讲,他还是函数。ES6 的class可以看作只是一个语法糖
与传统的构造函数相比
传统构造函数的缺点:
- 构造函数和原型方法及属性分离 不便于维护 降低可读性
- 原型对象可以被遍历修改
- 默认情况下构造函数可以被当做普通的函数进行调用 功能性不明确
- 原型中的方法也可以作为构造函数来用
下面是一个传统的构造函数
function Student(name, age) {
this.name = name;
this.age = age;
this.intro = function() {
console.log(`我叫${this.name},今年${this.age}岁了`);
}
}
Student.prototype.study = function() {
console.log("我爱学习");
}
var s1 = new Student("张三", 15);
ES6里面的class类是对传统构造函数的弥补。从另一方面来讲,类也是构造函数的一种。
下面是一个class类的案例
class Student {
constructor(name, age) {
this.name = name;
this.age = age;
this.study = function(){
console.log("我爱学习");
}
}
intro() {
console.log(`我叫${this.name},今年${this.age}岁了`)
}
}
var s1 = new Student("张三", 15);
console.log(s1.intro());
class类
ES6 的class可以看作只是一个语法糖,他在写的时候可以省略function关键字
特点
- 类是不可枚举的
- 类的没有变量提升 和let以及const一样 具有暂时性死区 必须先声明 再使用
- 类里面的方法 不可以作为构造函数来使用
- 类在使用的时候 必须配合new关键字进行使用 直接调用会报错
class类的继承
注意点:
- 使用calss关键字实现继承 需要使用extends关键字
- 使用class关键字继承,在写constructor时必须要使用super关键字,不然会报错
- 在class继承中,constructor可以省略不写,但是只要写了,就必须使用super关键字
class Student{
constructor(name, age) {
this.name = name;
this.age = age;
intro() {
console.log(`我叫${this.name}`,今年${this.age}岁了);
}
}
hobby(){
console.log("我喜欢唱歌跳舞");
}
}
class Child extends Student{
constructor(name, age){
super(name, age);
}
}
var c1 = new Child("张三", 6);