访问权限修饰符

165 阅读2分钟

属性和方法修饰符分类

public:修饰的属性可以在任意位置访问以及进行修改,表示公用。不加权限修饰符默认就是public

private:只能在当前类内部进行访问和修改,在创建的实例中也不能使用,表示私有。

protected:只能在当前类及其子类中被使用,表示受保护。

class Person {
    name:string;
    age:number;
    constructor(name:string,age:number){
        this.name=name;
        this.age=age;
    }
    
}

class People{
    constructor(public name:string,public age:number){

    }
}

两者是等价的。

存取器

可以定义方法来获取和修改私有属性,就是存取器。

class Person {
	private name: string;
	private age: number;
	getName() {
		return this.name;
	}
	setName(name:string) {
		this.name = name;
	}
}

let p = new Person();
p.setName("小王");  //p.name = "小王"
console.log(p.getName());

getter方法用来读取属性,setter方法用来设置属性,它们被称为属性的存取器。没有setter方法的属性相当于只读属性。使用 getter 和 setter 可以改变属性的赋值和读取行为并且更安全(用户提交数据的时候提交的是攻击代码):做一些自己想做的事情,比如数据发生改变的时候,重新渲染页面。

class Animal {
   private name:string;
  constructor(name:string) {
    this.name = name;
  }
  get name() {
    return 'Jerry';
  }
  set name(value:string) {
    console.log('setter: ' + value);
  }
}

let a = new Animal('Kitty'); // 会打印setter: Kitty
a.name = 'Tom'; // 打印setter: Tom
console.log(a.name); // Tom

TS中设置存取器的方法可以在get和set后面直接跟属性名就是该属性的存取器。在创建的实例访问和操作属性值时就会执行相应的存取器方法,而不是直接操作属性就修改了属性值。

构造函数权限修饰符

private修饰构造函数:“new 类(...)” 只能在当前类的方法中进行,构造函数为private的类不能当作父类。

protected修饰构造函数: “new 类(...)” 只能在当前类及其子类中进行。

public修饰构造函数:"new 类(...)" 任何地方可进行,不加修饰符默认是public。

访问修饰符与开闭原则

  • 类中成员使用什么修饰符修饰,思想上须符合开闭原则。- - 成员量写成私有,为成员变量提供get/set方法,之所以这样做是因为函数安全性大于字段安全性
  • 一个类中有一个功能,可以会分成多个步骤,可以把这些步骤使用private修饰方法进行封装,这样可以把实现细节隐藏(重要),还可以代码重用(次要)
class Person { 
	//脱衣服
	private disrobe() {
		//.....
	}
	// 穿衣服
	private dress() {
		//.....
	}
	//洗操
	public takeAbath() {
		this.disrobe();
		console.log("洗澡了");
		this.dress();
	} 
	//睡觉
	public sleep() {
		this.disrobe();
		console.log("睡觉了");
		this.dress();
	}
}