- class (类)作为对象的模板被引入,可以通过 class 关键字定义类。
- class 的本质是 function。
- 它可以看作一个语法糖,让对象原型的写法更加清晰、更像面向对象编程的语法。
类定义:类表达式可以为匿名或命名。
// 匿名类
let Example = class {
constructor(props){
}
}
// 但若是
class {
constructor(props) {
}
}
// SyntaxError: Unexpected token '{'
// 命名类
let Example = class Example{}
或
class Example{}
类声明:类不可重复声明
class Example{}
class Example{}
// Uncaught SyntaxError: Identifier 'Example' has already been declared
let Example = class{}
class Example{}
// Uncaught SyntaxError: Identifier 'Example' has already been declared
类定义不会被提升,必须在访问之前对类进行定义,否则会报错。
类中方法不需要function关键字。
类的主体
属性:prototype
ES6 中,prototype 仍旧存在,虽然可以直接自类中定义方法,但是其实方法还是定义在 prototype 上的。 覆盖方法 / 初始化时添加方法。
class Example{}
Example.prototype={
//methods
}
Object.assign(Example.prototype,{
//methods
})
静态属性
class Example {
// 新提案
static a = 2;
}
console.log(Example.a) // 2
// 目前可行写法
Example.b = 2;
console.log(Example.b) // 2
公共属性
class Example{}
Example.prototype.a = 2;
实例属性:定义在实例对象( this )上的属性。
class Example {
a = 2;
constructor () {
console.log(this.a);
}
}
name 属性:返回跟在 class 后的类名(存在时)。
let Example=class Exam {
constructor(a) {
this.a = a;
}
}
console.log(Example.name); // Exam
let Example=class {
constructor(a) {
this.a = a;
}
}
console.log(Example.name); // Example
方法
constructor 方法是类的默认方法,创建类的实例化对象时被调用。
class Example{
constructor(){
console.log('我是constructor');
}
}
new Example(); // 我是constructor
静态方法
class Example{
static sum(a, b) {
console.log(a+b);
}
}
Example.sum(1, 2); // 3
原型方法
class Example {
sum(a, b) {
console.log(a + b);
}
}
let exam = new Example();
exam.sum(1, 2); // 3
实例方法
class Example {
constructor() {
this.sum = (a, b) => {
console.log(a + b);
}
}
}
类的实例化
new:class 的实例化必须通过 new 关键字。
class Example {}
let exam1 = Example();
// Class constructor Example cannot be invoked without 'new'
let exam1 = new Example();
extends:通过 extends 实现类的继承
class Child extends Father { ... }