TypeScript 学习笔记 — 类的基本用法(五)
类的组成部分:构造函数、属性(实例属性、原型属性、静态属性)、方法(实例方法、原型方法、静态方法、访问器)
TS 中定义类
实例属性/方法:所有实例上的属性和方法都需要先声明后再使用
class Circle {
x: number;
y: number;
constructor(x: number, y: number = 0, ...args: number[]) {
// 默认值、剩余运算符
this.x = x;
this.y = y;
}
}
let circle = new Circle(100);
类中实例属性、方法 + 修饰符
上述代码当构造函数参数比较多时,声明就会显得很多,结构不友好,此时需要使用类的修饰符
来解决,表示可访问的范围或权限
类的修饰符分类: public (公开的:自己,子类,外界)、protected(受保护的:自己、子类)、private(私有的:自己)、readonly(只读的)
public
class Animal {
/*
public name!: string; // 不写public默认也是公开的
public age!: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
*/
// 可以简写为:直接在参数前添加对应的修饰符,就会默认添加到实例中,相当于已经声明
constructor(public name: string, public age: number) {
this.name = name;
this.age = age;
}
}
class Cat extends Animal {
constructor(name: string, age: number) {
super(name, age);
console.log(this.name, this.age); // 子类访问
}
}
let p = new Cat("Tom", 18);
console.log(p.name, p.age); // 外层访问
protected
class Animal {
// 可以简写为:直接在参数前添加对应的修饰符,就会默认添加到实例中,相当于已经声明
constructor(protected name: string, protected age: number) {
this.name = name;
this.age = age;
}
}
class Cat extends Animal {
constructor(name: string, age: number) {
super(name, age);
console.log(this.name, this.age); // 子类访问
}
}
let p = new Cat("Tom", 18);
console.log(p.name, p.age); // 异常:属性“name”受保护,只能在类“Animal”及其子类中访问
private
class Animal {
constructor(private name: string, private age: number) {
this.name = name;
this.age = age;
}
}
class Cat extends Animal {
constructor(name: string, age: number) {
super(name, age);
console.log(this.name, this.age); // 异常:属性“name”为私有属性,只能在类“Animal”中访问。
}
}
let p = new Cat("Tom", 18);
console.log(p.name, p.age); // 异常:属性“name”为私有属性,只能在类“Animal”中访问。
readonly
仅读属性只能在 constructor 中被赋值,因为是相当于初始化
class Animal {
constructor(public readonly name: string, public age: number) {
this.name = name; // 仅读属性只能在constructor中被赋值,因为是相当于初始化
this.age = age;
}
changeName(name: string) {
this.name = name; // 异常:无法分配到 "name" ,因为它是只读属性。
}
}
class Cat extends Animal {
constructor(name: string, age: number) {
super(name, age);
}
}
let p = new Cat("Tom", 18);
p.changeName("Jerry");
实例方法
class Animal {
public eat: () => void; // 实例方法
constructor() {
this.eat = () => {
console.log("eat");
};
}
}
let an = new Animal();
an.eat();
类中原型属性、方法 + 访问器
原型属性 + 访问器
class Animal {
private _name: string = "Tom"; // 原型属性
get name() {
// 需要通过类的访问器,访问 原型上的属性
return this._name;
}
set name(newValue) {
this._name = newValue;
}
}
let an = new Animal();
console.log(an.name);
原型方法
class Animal {
say(message: string) {
console.log(message);
}
}
let an = new Animal();
an.say("hello");
类中静态属性、方法
静态属性、方法都是通过类名直接调用
,并且静态属性和静态方法是可以被子类所继承
的
class Animal {
static type = "哺乳动物"; // 静态属性
// 静态方法
static getName() {
return "动物类";
}
}
class Cat extends Animal {}
console.log(Animal.type);
console.log(Animal.getName());
console.log(Cat.type);
console.log(Cat.getName());
子类重写父类方法
要求必须和父类的方法类型一致,也就是说方法的入参与返回值的类型,需要兼容
父类方法的类型
class Animal {
static getType(ms: string) {
console.log("父");
}
say(ms: string): void {
console.log("父 say");
}
}
class Mouse extends Animal {
static getType() {
console.log("子");
}
say() {
console.log("子 say");
return 123;
}
}
let mouse = new Mouse();
mouse.say();
Mouse.getType();
类中 Super 属性
- 原型方法中的 super 指代父类的原型
- 静态方法中的 super 指代父类
- 构造函数中的 super 指代父类
class Animal2 {
static getType() {
console.log("父");
}
public eat: () => void;
constructor() {
this.eat = () => {
console.log("eat");
};
}
say(): void {
console.log("父 say");
}
}
class Mouse extends Animal2 {
static getType() {
console.log("子");
super.getType(); // super 指代父类
}
constructor() {
super(); // super 指代父类
}
say() {
console.log("子 say");
super.say(); // super 指代父类的原型
}
}
let mouse = new Mouse();
mouse.say(); // 依次打印:子 say、 父 say、
mouse.eat(); // 打印:子 say、 父 say、
Mouse.getType(); // 依次打印:子、 父
修饰符 + constructor(){}
构造函数中增加了 private 和 protected,表示父类不能被 new,此时使用场景并不是很多,通常多见于单例模式
单例模式
class Singleton {
static instance = new Singleton();
private constructor() {} // 默认不写 是public
static getInstance() {
return this.instance;
}
}
// 单例模式
let instance1 = Singleton.getInstance();
let instance2 = Singleton.getInstance();
console.log(instance1 === instance2); // true
抽象类 abstract
抽象类的特点:
- 由
abstract
修饰的类叫做抽象类,也可以修饰抽象方法
- 抽象方法不能在抽象类中实现,只能在抽象类的具体子类中实现,而且必须实现。
- 只有抽象类中可以有抽象方法,
- 抽象类中可以有普通方法,普通方法不需要被子类重写
- 抽象类不能被实例化,也就是不能 new,只能被继承
- 定义类型时 void 表示函数的返回值为空(不关心返回值类型,所有在定义函数时也不关心函数返回值类型)
abstract class Animal {
// 1
abstract speak(): void; // 3,
drink() {
// 4
console.log("drink");
}
}
class Cat extends Animal {
speak() {
// 2
console.log("猫叫");
}
}
class Dog extends Animal {
speak(): string {
// 6
console.log("汪叫");
return "wangwang";
}
}
new Animal(); // 5. 报异常:无法创建抽象类的实例
抽象类定义实例方法及原型方法
实例方法
abstract class Person {
abstract eat: () => void; // 定义实例方法
}
class Teacher extends Person {
eat: () => void; // 属性“eat” 初始化,且需要在构造函数中明确赋值。
constructor() {
super(); // 访问派生类的构造函数中的 this前,必须调用"super"。
this.eat = function () {
console.log("eat");
};
}
}
原型方法
abstract class Person {
abstract eat(): void; // 定义原型方法
}
class Teacher extends Person {
eat(): void {
// 非抽象类"Teacher"需要实现父类"Person”"的抽象成员"eat"。
console.log("eat");
}
}
TypeScript 学习笔记 — 类的基本用法(五)的更多相关文章
- Typescript 学习笔记五:类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记四:回忆ES5 中的类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记七:泛型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记六:接口
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记二:数据类型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记三:函数
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记一:介绍、安装、编译
前言 整理了一下 Typescript 的学习笔记,方便后期遗忘某个知识点的时候,快速回忆. 为了避免凌乱,用 gitbook 结合 marketdown 整理的. github地址是:ts-gitb ...
- TypeScript学习笔记(八):1.5版本之后的模块和命名空间
我之前有写过TS1.5版本之前的“模块”的笔记:TypeScript学习笔记(七):模块 但是TS这里的模块和在ECMAScript 2015里的模块(即JS原生支持了模块的概念)概率出现了混淆,所以 ...
- 触发器学习笔记(:new,:old用法)
触发器学习笔记(:new,:old用法) 触发器是数据库发生某个操作时自动运行的一类的程序 用于保持数据的完整性或记录数据库操作信息方面 触发器不能够被直接调用,只能够 ...
- 《python基础教程(第二版)》学习笔记 类和对象(第7章)
<python基础教程(第二版)>学习笔记 类和对象(第7章) 定义类class Person: def setName(self,name): self.name=n ...
随机推荐
- C温故补缺(三):存储类声明符(auto,register,extern,static)
auto,register,extern,static 四个存储类声明符,用于定义变量/函数的作用域和声明周期 ① auto:自动变量,即普通变量,在平时定义变量时会自动赋予其auto类型 被auto ...
- vscode,java中文乱码
1.vscode默认是utf-8,但最好再打开自动检测 2.在vscode设置里搜 auto guess,启用auto guess encoding 3.windows默认的是gbk,在windows ...
- WeetCode3 暴力递归->记忆化搜索->动态规划
笔者这里总结的是一种套路,这种套路笔者最先是从左程云的b站视频学习到的 本文进行简单总结 系列文章目录和关于我 一丶动态规划的思想 使用dp数组记录之前状态计算的最佳结果,找出当前状态和之前状态的关系 ...
- 【Java EE】Day09 JavaScript基础
一.JavaScript简介 二.JavaScript语法 三.JavaScript对象
- 【每日一题】【优先队列、迭代器、lambda表达式】2022年1月15日-NC119 最小的K个数
描述 给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数.例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4(任意顺序皆可). 数据范围: ...
- sql周报
数据库分类 1.关系型数据库 Mysql Qracle MariaDB PostgreSQL mysql:开源免费 使用最广 性价比最高 Oracle:收费 但安全性高 PostgreSQL:开源免费 ...
- tcp/udp 协议特性和三次握手
一.TCP/UDP协议特性1)TCP特性:工作在传输层.建立连接.可靠的.错误检查 2)UDP特性:工作在传输层.不需要连接.不可靠的.有限的错误检查.传输性能高 2.控制位及确认号解释 控制位:由6 ...
- Golang Gorm 封装 分页查询 Where Order 查询
说说为什么写Gorm,因为公司新项目需要,研究了下Go下的gorm.对于一个项目首先考虑的问题,就是封装一些常用的工具方法,例如多参数查询 where or Like 还有order by Limit ...
- 6、SQL模糊查询LIKE concat用法
concat用来拼接查询的字符串: SELECT * FROM `page_demo` WHERE name LIKE concat('%',#{name},'%') 模糊查询: 1.%代表零个或多个 ...
- 总结开源项目中的常见坏实践(Bad Practice)
一些开源项目包含了各种编程的最佳实践供人参考学习和借鉴.但是也有一些开源项目虽然初衷是好的.但是包含了一些代码的坏实践.特别是对于一部分刚入行的大学生来说,可能会给到一些错误的示范.于是在此列举一些项 ...