class

2021/12/2

# 声明

没有变量提升

  • 普通function可以调用后声明,因为有变量提升
  • class没有变量提升机制,不可以先调用后声明
  • function的变量提升
fn(); // ---

function fn() {console.log('---')}
1
2
3
  • class无变量提升
const p = new People(); // error

class People {}
1
2
3

# 存取器

class People {
  _name = ""
  set name(name) {
    console.log(name);
    this._name = name;
  }

  get name() {
    return this._name
  }
}

const p = new People();
p.name = "呵呵";
const n = p.name;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 私有字段

  • (es2021)只有本类内的方法可以访问到该属性
class People {
  #name = ""
  set name(name) {
    console.log(name);
    this.#name = name;
  }

  get name() {
    return this.#name
  }
}

const p = new People();
p.name = "呵呵";
const n = p.name;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 继承

  • 继承的class在constructor内要要使用this,需要先调用super
  • 类的继承的本质是super调用父类constructor创造this给子类,再把子类和父类的prototype通过_ _ proto _ _连起来

# 实体属性

两种绑定方法

  1. 类内用 = 号赋值
  2. constructor内声明到this

# 实体方法

实体方法

  • 实体方法可以类内=号定义
  • 也可以constructor内绑定

# 静态属性

  • 静态属性通常作为常量使用,如:Number.EPSILON

# 静态方法

作用

  • 静态方法通常作为全局工具函数使用,因为不需要创建对象也能访问

静态函数的this

  • 静态方法没有绑定this,谁调用指向谁
class A {
    static go() {
        console.log(this);
    }
}
A.go(); // Class A

// 谁调用this是谁
const b = {go: A.go};
b.go(); // { go: [Function: go] }
1
2
3
4
5
6
7
8
9
10

# 原型属性

  • 原型属性只能在类外定义

 

 
 

class A {}
A.prototype.age = 18;
const a = new A();
console.log(a.age); // 18
console.log(Object.hasOwnProperty('age')); // false
1
2
3
4
5

# 原型方法

# this

  • class内有三种this
    1. 实例身上的函数this指向实例本身
    2. 原型对象上的函数this指向调用的实例
    3. 类上的静态方法谁调用指向谁,一般就是类本身

另外,class内的this是有值的,因为class本质是function的封装,由于new调用的方式,会给作用域绑定上this值,所以箭头函数也能拿到正确的this


 
 


 
 

 
 
 







class A {
    // 实例方法
    a = function() { console.log(this) };
    // a = () => console.log(this);
    
    // 原型函数
    b() { console.log(this) }

    // 静态方法
    static  c = function() { console.log(this) }
    static  d = () => console.log(this)
}

const obj = new A();
obj.a(); // { a: [Function] }
obj.b(); // { a: [Function] }
A.c();   // [class A] { c: [Function: c] }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 总结

  • js中class是特殊的function
  • function内部有call方法和constructor方法,class定义后只能用new方法调用内部constructor方法
  • class自身可以有有静态属性/方法
  • 一个class和构造出来的对象有:
    1. 对象的实例属性/方法
    2. class原型对象的属性/方法
    3. 继承构造的实例属性/方法
    4. 原型链上继承的属性/方法

总结

  • 除了原型属性,其他都可以在类内定义
上次更新: 9/17/2024