TypeScript(十一)类的存取器

206 阅读2分钟

TypeScript 中类的存取器分为两种,getter(读取)和setter(赋值),我们先写一个类,然后在这个类的基础上去介绍getter和setter。

class Person {
  _age: number;
  constructor(_age) {
    this._age = _age;
  }
}

let obj = new Person(35);
console.log(obj._age)        //35

上面的代码中我们定义了一个名叫Person的类,然后定义了一个属性名叫_age,在下面实例化赋给obj后可以打印出obj的_age属性,是因为_age前面没有加修饰符,默认值是public,所以在类的外部可以访问到。那现在如果_age的属性要设置为私有,也就是前面要加上private,此时类的外部是访问不到的,这时要想访问到就要用到getter。

一、getter

class Person {
  private _age: number;
  constructor(_age) {
    this._age = _age;
  }
  //getter读取
  get age() {
    return this._age;
  }
}

let obj = new Person(35);
console.log(obj.age)        //35

在上面的代码中_age前面加上了修饰符private,此时我们使用getter读取,写法就是get加上一个名称,这种写法类似一个函数,实则这是一个属性。我们把私有的_age赋值到age,然后就可以在类的外部访问到age了。

这种写法的意义在于我们对private修饰的属性进行了一个保护,可以在getter时进行修改或加密,比如

class Person {
  private _age: number;
  constructor(_age) {
    this._age = _age;
  }
  //getter读取
  get age() {
    return this._age - 10;
  }
}

let obj = new Person(35);
console.log(obj.age)        //25

二、setter

当我们想修改这个obj的age时,可能会这样写

class Person {
  private _age: number;
  constructor(_age) {
    this._age = _age;
  }
  //getter读取
  get age() {
    return this._age;
  }
}

let obj = new Person(35);
console.log(obj.age)        //35

obj.age = 66;				//编辑器报错
console.log(obj.age)        

此时看到编辑器报错,证明写法是错误的,这时候应该用到setter去赋值

class Person {
  private _age: number;
  constructor(_age) {
    this._age = _age;
  }
  //getter读取
  get age() {
    return this._age;
  }
  //setter赋值
  set age(age) {
    this._age = age;
  }
}

let obj = new Person(35);
console.log(obj.age)        //35


obj.age = 66;
console.log(obj.age)        //66

setter写法和getter类似,可以对属性进行保护和进一步的处理。