vue3第三十七节(TS 之 class 类实现及使用)

引言 :面相对象编程在我们工作中必须同时也是不可或缺的一部分,想要对JavaScript | TypeScript 有更加深刻的理解应用,我们需要充分学习应用

1、类的基本用途

在TS中 类描述了所创建的对象共同的属性和方法。TypeScript 支持面向对象的所有特性,比如 类、接口等。 具体包含以下方面字段 − 字段是类里面声明的变量。字段表示对象的有关数据。 构造函数 − 类实例化时调用,可以为类的对象分配内存。 方法 − 方法为对象要执行的操作

typescript 复制代码
class Person {
    // 变量
    name: string;
    age: number;
    // 静态变量
    static other: string = '静态变量';
    // 构造函数
    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }
    // 方法
    // 静态变量只能在静态方法中使用
    static say(word: string): void {
        console.log(this.other + '说话' + word)
    }
    play(things: string): void {
        console.log(this.name + ' ' + things)
    }
} 

2、类的继承

类的继承是通过 extend 来实现的 子类除了不能继承父类的私有成员(方法和属性)和构造函数,其他的都可以继承 。 其中:父类称为:超类|基类 子类成为:派生类

注意TypeScript 一次只能继承一个类,不支持继承多个类,但 TypeScript 支持多重继承泪如(B 继承 A,C 继承 B)。

scala 复制代码
class Person1 extends Person {
    like: string;
    constructor(name: string, age: number, like: string) {
        // 调用父类的构造函数
        super(name, age); 
        this.like = like;
    }
    // 子类中有父类同名的方法时,则会重写父类中的方法
    play(things: string):void {
        console.log('play', things);
    }
}

3、多重继承

Person1 继承了 Person, 而 Student 又继承了 Person1 // 子类 继承 父类2

scala 复制代码
class Student extends Person1 {
    public grade: string;
  
    constructor(name: string, age: number, grade: string) {
      super(name, age, grade); // super 引用父类的构造函数
      this.grade = grade;
    }
  
    // 方法重写:子类方法名和父类相同,将重写父类方法
    play(ball: string): void {
      console.log(this.name + "在玩" + ball);
    }
  }

4、static 关键字

static 关键字用于定义类的数据成员(属性和方法)为静态的,静态成员可以直接通过类名调用。

如父类 Person 中定义的 other属性,say方法 都是静态成员

其他关键字还有public(默认):公有,可以在任何地方被访问 protected: 受保护,可以被其自身以及其子类访问 private: 私有,只能被其定义所在的类访问。 readonly: 可以使用 readonly关键字将属性设置为只读的。 只读属性必须在声明时或构造函数里被初始化

typescript 复制代码
class StudentA {
    public name: string;
    protected age: number;
    private love: string;
  
    constructor(name: string, age: number, love: string) {
      this.name = name;
      this.age = age;
      this.love = love;
    }
    say(): void {
      console.log("hello world");
    }
  }
  

5、类实现 通过 implements 实现接口

可以使用一个 implements 子句来检查一个类,是否满足了一个特定的接口

注意: 实现一个带有可选属性的接口并不能创建该属性,只要一个接口继承了某个类, 那么就会继承这个类中所有的属性和方法,但是只会继承属性和方法的声明, 不会继承属 性和方法实现

php 复制代码
**与`extends`的区别​**    

extends: 继承某个类,继承之后可以使用父类的方法,也可以重写父类的方法
implements:实现某个接口,必须重写才可以使用


// 定义接口规范
php 复制代码
interface PersonE {
    name: string;
    age?: number; // 在接口的成员变量后加 ? 代表此成员变量可不用被类实现
    eat(food: string): void; // 在接口中可不写方法体
  }

// 定义类实现接口()

typescript 复制代码
 class StudentE implements PersonE {
    name: string;
    constructor(name: string) {
      this.name = name;
    }
    // 在类中必写方法体
    eat(food: string): void {
      console.log(this.name + "吃" + food);
    }
  }

应用

csharp 复制代码
  let alias = new StudentE("alias");
  console.log(alias);
  alias.eat("玉米糁");

7、抽象类 关键字:abstract

less 复制代码
A/抽象类不可以被实例化,只能被继承
B/抽象类中定义的抽象方法必须被继承它的子类重写
C/抽象类中的方法和变量可以是抽象的(被 `abstract` 修饰)也可以是不抽象的,但接口的方法和变量都是抽象的(都要被重写)
D/在抽象类中的抽象方法不写方法体
E/一个类只能继承一个抽象类

//  定义抽象类
typescript 复制代码
abstract class PersonF {
  name: string;
  age?: number;
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
  // 非抽象方法
eat(food: string): void {
    console.log(this.name + "吃" + food);
  }
  // 抽象方法,无方法体
  abstract play(ball: string): void;
}

// 定义子类继承抽象类

scala 复制代码
class StudentF extends PersonF {
  sex: string;
  constructor(name: string, age: number, sex: string) {
    super(name, age);
    this.name = name;
    this.sex = sex;
  }
  // 在子类中必须重写抽象类的抽象方法
  play(ball: string): void {
    console.log(this.name + "玩" + ball);
  }
}
csharp 复制代码
let alias = new Student("alias", 18, "汉子");
console.log(alias);
alias.eat("香蕉");
alias.play("象棋");
相关推荐
SailingCoder2 分钟前
递归陷阱:如何优雅地等待 props.parentRoute?
前端·javascript·面试
关山月34 分钟前
React 中的 SSR 深度探讨
前端
yzhSWJ1 小时前
vue设置自定义logo跟标题
前端·javascript·vue.js
vvilkim2 小时前
Vue.js 中的 Tree Shaking:优化你的应用性能
前端·javascript·vue.js
杨超越luckly2 小时前
HTML应用指南:利用GET请求获取猫眼电影日票房信息——以哪吒2为例
前端·数据挖掘·数据分析·html·猫眼
狼性书生2 小时前
uniapp 实现的下拉菜单组件
前端·uni-app·vue·组件·插件
浪裡遊2 小时前
uniapp中的vue组件与组件使用差异
前端·vue.js·uni-app
风无雨2 小时前
react 中 key 的使用
前端·react.js·前端框架
shix .2 小时前
某视频的解密下载
服务器·前端·音视频
吃杠碰小鸡2 小时前
css-grid布局
前端·css