类class(JS & TS)


1. 类的定义

  • 使用class关键字;
  • 在严格模式下,需要给属性初始化。
  • 直接初始化,或在constructor中初始化都可以。
class Person {
    name: string = '',  //1.直接初始化
    age: number = 0,
    // 2.也可以这样:在执行构造器时要求传进参数初始化:
    constructor(name: string, age: number) {
        this.name = name;
        this.age = age    
    }
    // 类中可以定义方法:
    eating() {
        console.log(this.name + '~');
    }
}

const p = new Person('lwl', 24);  // 这里会执行类的constructor
p.eating();   //调用类中定义的方法

PS:在TS中删去了动态属性的使用,例如👆🏻第2&3行代码如果不写,constructor里的赋值会报错,而非添加属性,这时会找不到该属性。

2. 类的继承 extends

  • 当两个类有部分相同的属性,可以专门定义一个类抽进去。
class Person {
    name: string = '',
    age: number = 0
    eating() {
        console.log('eat');    
    }
}

// 继承上面类中的属性:
class Student extends Person {
    sId: number = 0
    study() {
        console.log('study');    
    }
}

class Teacher extends Person {
    title: string = '',
    teach() {
        console.log('teach');
    }
}

const stu =  new Student();
stu.name = 'lwl';
stu.age = 24;
console.log(stu.name);
console.log(stu.age);
stu.eating();    // 会发现继承后,stu也能调到eating方法。

2.1 constructor super

  • super可以调用父类的构造器;
  • 应该是创建某个对象时就初始化,
class Person {
    name: string
    age: number
    
    constructor(name: string, age: number) {
        this.name = name
        this.age = age    
    }
    
    eating() {
        console.log('eat');    
    }
}

class Student extends Person {
    sId?: number
    
    // 当有一项不用传时,需要写为可选类型:
    constructor(name: string, age: number) {
        //super关键字可以调用到父类的
        super
        this.sid = sid;    
    }
    
    study() {
        console.log('study');    
    }
}

3. TS中类的使用

三个访问修饰符

  • public:公有。
  • private:外部不能访问。
  • protected,与private的区别是:在子类中可以访问到。

3.1 类实现接口

当不同的类中有相同的方法,可以将它们提取为接口,并利用**implements**关键字实现。

使用示例:https://ts.xcatliu.com/advanced/class-and-interfaces.html

3.3 接口继承类

PS:类继承接口未记录。

先看一个例子

  • 在TS中,接口可以继承类(JS中没有这种用法)。
  • 声明一个类的同时,它也将是一个类型。
class Point {
    x: number;
    y: number;
    constructor(x: number, y: number) {
        this.x = x;
        this.y = y;
    }
}

// 等价于上面的Point,因为Point同时可以当作一个TS类型:
interface PointInstanceType {
    x: number;
    y: number;
}

function printPoint(p: PointInstanceType) {
    console.log(p.x, p.y);
}

printPoint(new Point(1, 2));

待补充


文章作者: polariis
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 polariis !
评论
  目录