TypeScript——类(class)

news2024/11/16 3:47:56

ES6 中类的用法

下面我们先回顾一下 ES6 中类的用法,更详细的介绍可以参考 ECMAScript 6 入门 - Class

属性和方法

使用 class 定义类,使用 constructor 定义构造函数。

通过new生成新实例的时候,会自动调用构造函数。

class Person{
    constructor(name) {
        this.name = name;
    }
    sayHi() {
        return `My name is ${this.name}`;
    }
}

let a = new Person('Jack');
console.log(a.sayHi()); // My name is Jack

类的继承

使用 extends 关键字实现继承,子类中使用 super 关键字来调用父类的构造函数和方法。

class Student extends Person {
  constructor(name) {
    super(name); // 调用父类的 constructor(name)
    console.log(this.name);
  }
  sayHi() {
    return 'Hello, ' + super.sayHi(); // 调用父类的 sayHi()
  }
}

let c = new Student('Tom'); // Tom
console.log(c.sayHi()); // Hello, My name is Tom

静态方法

使用 static 修饰符修饰的方法称为静态方法,它们不需要实例化,而是直接通过类来调用

class Foo {
  static classMethod() {
    return 'hello'
  }
}

let a = Foo.classMethod()
console.log(a) // 'hello'

var foo = new Foo()
foo.classMethod()
// TypeError: foo.classMethod is not a function

实例属性

ES6 中实例的属性只能通过构造函数中的 this.xxx 来定义,ES7 提案中可以直接在类里面定义

class Person {
  name = 'zs'

  constructor() {
    // ...
  }
}

let a = new Person()
console.log(a.name) // zs

静态属性

指的是 Class 本身的属性,即Class.propName,而不是定义在实例对象(this)上的属性

class Person {
  static age = 18

  constructor() {
    // ...
  }
}

console.log(Person.age) // 18

TypeScript 中类的用法

定义变量

在TypeScript是不允许直接在constructor 定义变量的 需要在constructor上面先声明

在这里插入图片描述
在这里插入图片描述

类的修饰符

  • public(公共)
    public 修饰的属性或方法是公有的,可以在任何地方被访问到,默认所有的属性和方法都是 public
  • private(私有)
    private 修饰的属性或方法是私有的,不能在声明它的类的外部访问
  • protected(受保护)
    protected 修饰的属性或方法是受保护的,它和 private 类似,区别是它在子类中是允许被访问的
class Person {
  public name:string
  private age:number
  protected gender:string|number
  public constructor(name:string,age:number,gender:string|number) {
    this.name = name;
    this.age = age;
    this.gender = gender
  }
}

let zs = new Person('zs',18,'M')
zs.age       // error:属性“age”为私有属性,只能在类“Person”中访问
zs.gender    // error:属性“gender”受保护,只能在类“Person”及其子类中访问
class Person {
  public name: string
  private age: number
  protected gender: string | number
  public constructor(name: string, age: number, gender: string | number) {
    this.name = name
    this.age = age
    this.gender = gender
  }
}

class Man extends Person {
  constructor() {
    super('zs', 18, 'M')
    // 子类可以访问到
    console.log(this.gender) // M
  }
}

let person = new Person('ls', 20, 'M')
let man = new Man()
man.gender // error: 属性“gender”受保护,只能在类“Person”及其子类中访问

参数属性

修饰符和readonly还可以使用在构造函数参数中,等同于类中定义该属性同时给该属性赋值,使代码更简洁

class Person {
  // public name: string;
  constructor(public name: string) {
    // this.name = name;
  }
}

let p = new Person('zs')

console.log(p.name) // zs

readonly

只读属性关键字,只允许出现在属性声明或索引签名或构造函数中

class Person {
  readonly name: string
  public constructor(name: string) {
    this.name = name
  }
}

let a = new Person('Jack')
console.log(a.name) // Jack
// a.name = 'Tom' // error: 无法分配到 "name" ,因为它是只读属性

注意如果 readonly 和其他访问修饰符同时存在的话,需要写在其后面

class Person {
  // readonly name: string
  public constructor(public readonly name: string) {
    // this.name = name
  }
}

let a = new Person('Jack')
console.log(a.name) // Jack

抽象类

abstract用于定义抽象类和其中的抽象方法。

首先,抽象类是不允许被实例化的

abstract class Person {
  name: string
  constructor(name: string) {
    this.name = name
  }
  abstract init(name: string): void
}

let p = new Person('zs') // error 无法创建抽象类的实例

其次,抽象类中的抽象方法必须被子类实现

abstract class Person {
  name: string
  constructor(name: string) {
    this.name = name
  }
  abstract init(name: string): void
}

class Man extends Person {
  constructor(name: string) {
    super(name)
  }
  init(name: string): void {
    console.log(name)
  }
}

let zs = new Man('zs')
zs.init('ls')

interface定义类

类只能继承(extends)类,实现(implements)接口
类可以实现接口或类,类不可以继承接口,类只能继承类
接口不能实现接口或者类,可以继承接口或类
可多继承或者多实现

interface PersonOne {
  age: number
}

interface PersonTwo{
  gender: string
}

class A {
  name: string
  constructor() {
      this.name = "123"
  }
}

class Person extends A implements PersonOne,PersonTwo {
  age: number
  gender:string
  constructor() {
      super()
      this.age = 18
      this.gender = 'M'
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/677122.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode877. 石子游戏(动态规划-java)

石子游戏 leetcode877. 石子游戏题目描述暴力递归代码演示 动态规划 动态规划专题: leetcode877. 石子游戏 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/stone-game 题目描述 Alice 和 Bob 用几堆石子在做游戏。一共有…

HTTP与Fiddler使用

HTTP与Fiddler使用 HTTP与Fiddler使用FidderHTTP的报文结构:其他请求头User-agentReferer和OrigincookieHTTP状态码 HTTP与Fiddler使用 HTTP协议是使用十分广泛的应用层协议,也是一个可以由程序员进行设置的一个协议。该协议的结构规定了浏览器与万维网…

【C++】通讯录的基本实现,附有源码分享

目录 1、运行环境 2、系统实现功能 2.1菜单功能 2.2退出通讯录功能 2.3添加联系人功能 2.4显示联系人功能 2.5删除联系人功能 2.6查找联系人功能 2.7修改联系人功能 2.8清空联系人功能 2.9动态扩容功能 2.10选择优化功能 2.11文件操作 3、源码分享 1、运行环境 …

【备战秋招】每日一题:2023.04.26-华为OD机式-第三题-MC方块

在线评测链接:P1231 题目内容 MC最新版本更新了一种特殊的方块,幽匿催发体。这种方块能够吸收生物死亡掉落的经验并感染周围方块,使其变成幽匿块。Steve想要以此为基础尝试搭建一个经验仓库,他来到了创造超平坦模式,在只有草方块…

【微信小程序开发】第 7 课 - 小程序的常用组件

欢迎来到博主 Apeiron 的博客,祝您旅程愉快 ! 时止则止,时行则行。动静不失其时,其道光明。 目录 1、缘起 2、小程序中组件的分类 3、常用的视图容器类组件 3.1、view 组件 3.2、scroll - view 组件 3.3、swiper 和 swiper…

blfs:为lfs虚拟机增加桌面02

参考书籍: BLFS11.3 LFS11.3(这里面有软件安装的详细说明) 树莓派Linux操作系统移植(这里面有桌面系统的脉络梳理) 参考视频 https://www.youtube.com/watch?vcavxyXBgJ6Q&listPLyc5xVO2uDsBK_3VZOek8ICsxewOO4DU…

Vue3 网络请求——axios 高级用法之 axios 拦截器实战与并发请求

文章目录 📋前言🎯关于拦截器🎯项目创建🎯代码分析🎯补充:并发请求🧩axios.all() 和 Promise.all() 的区别 📝最后 📋前言 Axios 是一个流行的基于 Promise 的 HTTP 客户…

机器学习中的多分类问题

文章标题:机器学习中的多分类问题 机器学习中的分类问题可以大致分为二分类和多分类两种。在二分类问题中,模型需要将输入数据分为两类;而在多分类问题中,模型需要将输入数据分为多个类别。本文将介绍机器学习中的多分类问题及其…

C语言指针类型,8个例子给你讲明白

0.问题 知乎上回答了一个粉丝问题, 结果这兄弟又连续问了几个问题: 好吧,帮人帮到底,送佛送到西!给你讲彻底点吧! 1. int va; 这是一个整型变量,32位CPU的话,占有32个bite 2. in…

Redis入门(1)

1.NOSQL概述 1.1.什么是NOSQL NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题&…

设计模式之享元模式笔记

设计模式之享元模式笔记 说明Flyweight(享元)目录享元模式示例类图抽象图形类I图形类L图形类O图形类工厂类测试类 说明 记录下学习设计模式-享元模式的写法。JDK使用版本为1.8版本。 Flyweight(享元) 意图:运用共享技术有效地支持大量细粒度的对象。 结构: 其中&#xff1…

MCU(Cortex - M3/M4)启动加载过程和内存分配原理 笔记

最近发现对基础不太熟悉,写篇笔记记录一下MCU启动到用户C语言运行,之前做了那些工作,同时flash和Ram又分别保存了那个数据,每一段又是什么意义,方便后续自己忘记了,查阅。 一、 MCU启动 在MCU上电/复位之后…

WireShark常用协议抓包与原理分析

1.ARP协议(地址解析协议) nmap 发现网关nmap -sn 192.168.133.2wireshark 抓请求包和响应包 arp请求包内容 arp响应包内容 总结:请求包包含包类型(request),源IP地址,源MAC地址,目标IP地址,目标MAC地址(未知,此处为全0);响应包包含包类型(reply),源IP地址,源…

DAY28:回溯算法(三)组合总和Ⅲ+电话号码字母组合

文章目录 216.组合总和Ⅲ思路树形结构 完整版debug测试逻辑错误:没有输出 剪枝操作剪枝版本continue的用法剪枝最后是continue还是return的讨论 17.电话号码的字母组合思路树形结构 伪代码字符串中的字符2转化成int的方法字符串字符与int转换补充字符串与字符 完整版…

CTF-Show密码学【摩斯码、培根密码】

萌新 密码33 一、题目信息 题目名称:我想吃培根题目描述:-- — .-. … . …–.- … … …–.- -.-. — — .-… …–.- -… …- - …–.- -… .- -.-. — -. …–.- … … …–.- -.-. — — .-… . .-. …–.- – – -… -… – -… – -… – – – -…

ASP.NET Core MVC 从入门到精通之缓存

随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生&#xff0c…

理解KMP

KMP 问题 字符串匹配问题,问字符串 str1中是否存在连续的子串与字符串str2相等,存在返回子串的起始位置,否则返回-1 思路 传统做法是依次遍历str1中的每个字符作为起始位置,看是否能凑出字符串str2. KMP算法就是对传统做法的一种加速&am…

【Linux】软件包管理器yum与环境开发工具vim

【Linux】系列文章目录 【Linux】基础常见指令:http://t.csdn.cn/hwLPb 【Linux】基本权限:http://t.csdn.cn/faFZg 目录 前言 一、软件包管理器yum 1.什么是软件包? 2. yum的使用 (1)包文件查询 &#xff08…

EMA:基于跨空间学习的高效多尺度注意力模块

文章目录 摘要1、 简介2、相关工作3、高效多尺度注意力机制3.1、回顾坐标注意力(CA)3.2、多尺度注意力(EMA)模块 4、实验4.1、CIFAR-100上的图像分类4.2、ImageNet-1k上的图像分类4.3、MS COCO上的目标检测4.4、基于VisDrone的目标检测 5、消融实验6、 结论 摘要 https://arxi…

MIT 6.S081 Lab Six

MIT 6.S081 Lab Six 引言Copy-on-Write Fork for xv6问题解决方案Implement copy-on write (hard)代码解析 可选的挑战练习 引言 本文为 MIT 6.S081 2020 操作系统 实验六解析。 MIT 6.S081课程前置基础参考: 基于RISC-V搭建操作系统系列 Copy-on-Write Fork for xv6 虚拟内…