属性和方法修饰符分类
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();
}
}