TS类中属性的封装

我们在如下的代码中,我们在类中设置属性,创建的对象可以随意修改自身的属性,对象中的属性可以任意被修改导致对象中的数据非常不安全。

TypeScript 复制代码
// 创建一个Person类
class Person {
  name: string;
  age: number;
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
}

// 创建一个Person对象并进行修改
const per = new Person("寻霖", 18);
console.log(per);  // 打印:{name:"寻霖", age:18}
per.name = "XunLin";
per.age = 20;
console.log(per);  // 打印:{name:"XunLin", age:20}

一、 属性修饰符

(一)public修饰符

public修饰符设置的属性可以在任意地方修改和访问属性值,未给属性设置属性修饰符时默认值就是public。

public 属性名 : 数据类型;

(二)private修饰符

private修饰符设置的属性只能在类的内部修改和访问属性值。

private 属性名 : 数据类型;

我们在对象中去修改属性值的时候就会报错:

(三)protected修饰符

protected修饰符设置的属性只能在当前类和继承当前类的子类中使用。

TypeScript 复制代码
class A {
  protected num: number;
  constructor(num: number) {
    this.num = num;
  }
}

class B extends A {
  test() {
    console.log(this.num);
  }
}

const a = new A(1);
const b = new B(2);
b.test();  // 打印:2

二、定义属性存取器访问和设置私有属性

既然私有属性我们只能在类中进行访问,那我们就在类中定义访问和设置属性方法,对象通过调用方法去访问和设置属性。

getter方法用来获取属性,setter方法用来设置属性:

TypeScript 复制代码
// 创建一个Person类
class Person {
  private name: string;
  constructor(name: string) {
    this.name = name;
  }
  // 获取name属性
  getName() {
    return this.name;
  }
  // 设置name属性
  setName(name:string) {
    this.name = name;
  }
}

const per = new Person("寻霖");
console.log(per.getName());  // 打印:"寻霖"
per.setName("XunLin");
console.log(per.getName());  // 打印:"XunLin"

但是TS中提供了更方便的getter和setter方法的设置:

TypeScript 复制代码
// 创建一个Person类
class Person {
  private name: string;
  constructor(name: string) {
    this.name = name;
  }
  // getter方法获取name属性
  get propName() {
    return this.name;
  }
  // setter方法设置name属性
  set propName(value:string) {
    this.name = value;
  }
}

const per = new Person("寻霖");
console.log(per.propName);  // 打印:"寻霖"
per.propName = "XunLin";
console.log(per.propName);  // 打印:"XunLin"
相关推荐
baiduopenmap6 分钟前
百度世界2024精选公开课:基于地图智能体的导航出行AI应用创新实践
前端·人工智能·百度地图
hopetomorrow8 分钟前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
loooseFish14 分钟前
小程序webview我爱死你了 小程序webview和H5通讯
前端
小牛itbull17 分钟前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress
请叫我欧皇i26 分钟前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
533_29 分钟前
[vue] 深拷贝 lodash cloneDeep
前端·javascript·vue.js
闲暇部落29 分钟前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
guokanglun35 分钟前
空间数据存储格式GeoJSON
前端
GIS瞧葩菜38 分钟前
局部修改3dtiles子模型的位置。
开发语言·javascript·ecmascript
chnming198743 分钟前
STL关联式容器之set
开发语言·c++