# class-类

class只是一个语法糖,它的绝大部分功能,ES5都可以做到。

# 基本写法

class Person{
    ...
}

class中的实例方法,就是ES5中的原型方法,只是ES5的原型方法可枚举,而class的实例方法不可枚举。

class Person{
    toString(){
        //...
    }
}

//相当于如下写法:

function Person(){}
Person.prototype.toString = function(){
    //...
}

# 实例方法和属性

实例方法和属性的写法:

  • 构造函数里的属性和方法一定是实例属性和方法。
  • 直接定义在类的顶层的不加修饰符的属性和方法是实例属性和方法
class Person{
    age = 25; // 实例属性
    habbit; //实例属性
    constructor(name){
        this.name = name; // 实例属性
    }

	//实例方法
	sayName(){
        console.log(this.name);
    }
	//表达式
	[dynamicMethodName](){
        // 该实例方法的名字 取决于 dynamicMethodName 的值。
    }
}

提示

实例属性和方法必须通过实例调用。(傻子都知道吧......)

# 静态方法和属性

静态属性和方法的写法:

static关键字修饰即可。

class Person{
    static keysName = "staticName";//静态属性
	constructor(name){
        this.name = name; // 实例属性
    }
    //静态方法
    static staticMethod(){
        console.log("静态方法中的this是类,而不是类的实例,这点需要特别注意。")
    }
 	//静态表达式方法
    static [dynamicMethodName](){
         // 该实例方法的名字 取决于 dynamicMethodName 的值。
    }
}

提示

静态属性和方法只能通过类名调用。

# 私有方法和属性

#修饰属性或方法后就是私有属性和方法。属性和方法名包括#本身

class Person{
    #privateKys = "private";//私有属性
    constructor(name) {
        this.name = name; //实例属性
    }
    //私有方法
    #privateFunc(){
        console.log("private function!")
    }
}

提示

私有方法和私有属性,是只能在类的内部访问的方法和属性,外部不能访问。 通过实例(this)访问。

# 取值和存值函数

get、set关键字,对某个属性设置取值和存值函数,以此拦截该属性的存取行为。

class Person{
	constructor(age){
        this.age = age;
    }
    //取值、存值函数
    get Y(){
        return this.age;
    }
    set Y(value){
        console.log("set function used!");
        this.age = value;
    }
}
let wlk = new Person(25);
wlk.Y; // get
wlk.Y = 30; // set

警告

get/set函数名不能用属性的名字,不然会递归调用,形成死循环。

# 继承

extendssuper是继承的关键。

class Parent{
    constructor(name){
        this.name = name;
    }
}

class Child extends Parent{
    constructor(name,age){
        super(name); // 必须调用,切必须在开头
        this.age = age;
    }
}

子类必须在constructor方法中调用super方法,否则新建实例时会报错。这是因为子类自己的this对象,必须先通过父类的构造函数完成塑造,得到与父类同样的实例属性和方法,然后再对其进行加工,加上子类自己的实例属性和方法。如果不调用super方法,子类就得不到this对象

super关键字相当于父类的this

class Point{
    constructor(x,y){
        this.x = x;
        this.y = y;
    }
    toString(){
        //...
    }
}

class ColorPoint extends Point {
  constructor(x, y, color) {
    super(x, y); // 调用父类的constructor(x, y)
    this.color = color;
  }

  toString() {
    return this.color + ' ' + super.toString(); // 调用父类的toString()
  }
}

父类的静态属性和方法也会被子类继承。

class A {
  static hello() {
    console.log('hello world');
  }
}

class B extends A {
}

B.hello()  // hello world
作者:王龙楷; 标签:原创; 提交时间: 10/26/2020, 4:13:58 PM