TypeScript类的可访问性修饰符

类成员的修饰符

成员可访问性定义了类的成员允许在何处被访问。

TypeScript为类成员提供了以下三种可访问性修饰符:

  • public:类的公有成员没有访问限制,可以在当前类的内部、外部以及派生类的内部访问。类的公有成员使用public修饰符标识。在默认情况下,类的所有成员都是公有成员。
  • private:类的私有成员只允许在当前类的内部被访问,在当前类的外部以及派生类的内部都不允许访问。类的私有成员使用private修饰符标识。
  • protected:类的受保护成员允许在当前类的内部和派生类的内部访问,但是不允许在当前类的外部访问。类的受保护成员使用protected修饰符标识。

私有字段

2020年1月,ECMAScript标准引入了一个新特性,那就是允许在类中定义私有字段。这意味着JavaScript语言将原生地支持类的私有成员。TypeScript语言也从3.8版本开始支持该特性。在ECMAScript标准中,类的私有字段使用一种新的语法来定义,即在字段标识符前添加一个“#”符号。不论是在定义私有字段时还是在访问私有字段时,都需要在私有字段名前添加一个“#”符号。

class Circle {
    #radius: number;
 
    constructor() {
        this.#radius = 1;
    }
 }
 
const circle = new Circle();
circle.#radius; // 不允许访问

“#radius”定义了一个私有字段radius。不论是在定义私有字段时还是在访问私有字段时,都必须在字段标识符前添加一个“#”符号

类成员的存取器

将普通方法向外部暴露通过该方法对私有属性进行赋值

class Person {
	//成员字段
	private name: string
	private age: number | undefined
	//构造方法
	constructor(name: string, age?: number) {
		this.name = name;
		this.age = age;
	}
	//普通方法
	run(flag?: boolean): string {
		if (flag === true) {
			return "无法显示"
		}
		if (this.age === undefined) {
			return this.name + "年龄保密";
		}
		return this.name + "年龄为" + this.age;
	}
	//成员取值
	getName() {
		return this.name
	}
	//成员赋值
	setName(name: string) {
		this.name = name
	}
}

存取器

通过存取器对私有属性进行赋值

class Person {
	//成员字段
	private _name: string
	private _age: number | undefined
	//构造方法
	constructor(name: string, age?: number) {
		this._name = name;
		this._age = age;
	}
	//普通方法
	run(flag?: boolean): string {
		if (flag === true) {
			return "无法显示"
		}
		if (this._age === undefined) {
			return this._name + "年龄保密";
		}
		return this._name + "年龄为" + this._age;
	}
	//成员取值
	get name() {
		return this._name
	}
	//成员赋值
	set name(name:string){
		this._name=name
	}
}

声明和构造简写

class Person {
	//成员字段
	
	
	//构造方法
	constructor(private _name: string, private _age: number | undefined) {}
	//普通方法
	run(flag?: boolean): string {
		if (flag === true) {
			return "无法显示"
		}
		if (this._age === undefined) {
			return this._name + "年龄保密";
		}
		return this._name + "年龄为" + this._age;
	}
	//成员取值
	get name() {
		return this._name
	}
	//成员赋值
	set name(name:string){
		this._name=name
	}
}

静态成员和方法

static修饰静态成员和方法,不需要实例化调用,直接用类名调用

class Person {
	//成员字段
	private _name: string
	private _age: number | undefined
	//静态成员
	static PI: number = 3.14
	//构造方法
	constructor(name: string, age?: number) {
		this._name = name;
		this._age = age;
	}
	
	//静态方法
	static getPI() {
		return Person.PI;
	}
}
console.log(Person.PI)

抽象类

抽象类用于顶层制订和设计标准,让子类继承时去实现具体细节。

abstract class Person{
	constructor(protected name:string,protected age:number){}
	abstract run():string
}
new Person("Mr.Lee",100)

在这里插入图片描述
抽象类设计相关成员和方法,不用于具体使用,所以无法实例化。
根据抽象类的相关规范,子类继承抽象类实现相关的方法即可

abstract class Person{
	constructor(protected name:string,protected age:number){}
	abstract run():string
}
class Man extends Person{
	constructor(name:string,age:number){
		super(name,age)
	}
	run():string{
		return "Mr.Lee"
	}
}
let m = new Man("Mr.Lee",100)
console.log(m.run)

多态

在抽象类中定义一个抽象方法,在多个子类中实现这个方法

abstract class Person{
	abstract sleep():string
}
class Man extends Person{
	sleep(){
		return "Man sleep"
	}
}
class Woman extends Person{
	sleep(){
		return "Woman sleep"
	}
}

let m = new Man()
let w = new Woman()
let persons:Person[]=[m,w]
persons.forEach((ele)=>{
	console.log(ele.sleep())
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
TypeScript 中,和接口是两个重要的概念,用于面向对象编程和定义对象的结构。下面是关于 TypeScript和接口的一些重要信息: 1. (Classes): - 是对象的蓝图,用于定义对象的属和方法。 - 使用 `class` 关键字来定义一个,并使用构造函数来初始化的实例。 - 可以使用 `public`、`private` 和 `protected` 访问修饰符来控制成员的可见。 - 可以使用 `extends` 关键字来实现之间的继承。 - 可以包含属、方法和构造函数。 以下是一个使用 TypeScript 定义和使用的示例: ```typescript class Person { private name: string; constructor(name: string) { this.name = name; } public greet() { console.log(`Hello, ${this.name}!`); } } const person = new Person("John"); person.greet(); // 输出:Hello, John! ``` 2. 接口(Interfaces): - 接口用于定义对象的结构或的契约,并且在 TypeScript 中被广泛用于型检查和型推断。 - 使用 `interface` 关键字来定义一个接口,并在接口中定义属和方法的签名。 - 接口可以被实现(使用 `implements` 关键字)或对象使用(使用 `:` 进行型注解)。 - 接口可以继承其他接口,以便组合多个接口的结构。 - 接口的属可以是可选的,使用 `?` 来标记。 以下是一个使用 TypeScript 定义和使用接口的示例: ```typescript interface Shape { color: string; area(): number; } class Circle implements Shape { color: string; radius: number; constructor(color: string, radius: number) { this.color = color; this.radius = radius; } area() { return Math.PI * this.radius * this.radius; } } const circle: Shape = new Circle("red", 5); console.log(circle.area()); // 输出:78.53981633974483 ``` 通过使用和接口,你可以更好地组织和定义你的代码,并在编译时进行型检查,以减少错误并提高代码的可维护

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端御书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值