ECMAScript 6 新引入的 class 关键字具有正式定义类的能力。class(类) 其实是对ES5 的构造函数 , 继承等进行了封装 , 语法糖等 , 使的构造函数创建,继承等像使用类一样。
类定义
与函数类型相似,定义类也有两种主要方式:类声明和类表达式。这两种方式都使用 class 关键字加大括号。
// 类声明
class Person {
} // 不需要小括号
// 类表达式
const Animal = class {
};
类表达式
类表达式可以只有变量名, 也可以有类名和变量名
const person = class perClass{
}
以这种方法创建的类 , 可以在类里面使用这个类名 , 不能在外部使用一个类名
console.log(perClass) // ReferenceError: perClass is not defined
而如果要获取这个类名
console.log(person.name) // perClass (字符串)
注意 : 类的定义不会被提升
类受块作用域限制 , 即如果是在 IF里面创建的类 , 也是不能被外部引用的
if (true) {
class person {
}
}
console.log(person); // person is not defined
类的构成
类可以包含构造函数方法、实例方法、获取函数、设置函数和静态类方法,但这些都不是必需的。空的类定义照样有效。默认情况下,类定义中的代码都在严格模式下执行。
类构造函数
constructor 关键字用于在类定义块内部创建类的构造函数。**方法名 constructor 会告诉解释器在使用 new 操作符创建类的新实例时,应该调用这个函数。**构造函数的定义不是必需的,不定义构造函数相当于将构造函数定义为空函数。
实例化
使用 new 操作符实例化 Person 的操作等于使用 new 调用其构造函数。并且会将实例化对象以 this 传入 。
class Class1 {
constructor(name) {
console.log(this); // Class1 {} , 类的实例化对象
this.name = name
}
}
const c1 = new Class1('c1')
console.log(c1); // Class1 { name: 'c1' }
console.log(c1 instanceof Class1); // ture
默认情况下,类构造函数会在执行之后返回 this 对象。,如果没有其他地方再使用到这个 this 对象 , 那么它会被销毁。
不过,如果返回的不是 this 对象