在 TypeScript 中,属性的封装是一种将属性访问限制在类的内部或通过公共方法进行访问的技术。通过封装属性,可以隐藏属性的具体实现细节,提供对属性的安全访问和控制。
公共(Public)属性
在 TypeScript 中,默认情况下,类中定义的属性是公共的,即可以在类内部和外部直接访问。
代码语言:javascript复制class Person {
public name: string;
constructor(name: string) {
this.name = name;
}
}
const person = new Person("Alice");
console.log(person.name); // 输出: "Alice"
person.name = "Bob";
console.log(person.name); // 输出: "Bob"
在上面的例子中,name
属性是公共属性,可以在类内部和外部直接访问和修改。
私有(Private)属性
通过将属性声明为 private
关键字,可以将属性封装为私有属性,只能在类的内部访问。
class Person {
private name: string;
constructor(name: string) {
this.name = name;
}
public getName(): string {
return this.name;
}
}
const person = new Person("Alice");
console.log(person.name); // 错误: 属性“name”为私有属性,无法访问
console.log(person.getName()); // 输出: "Alice"
在上面的例子中,name
属性被声明为私有属性,无法在类的外部直接访问。但可以通过公共方法 getName()
在类的内部访问私有属性。
受保护(Protected)属性
通过将属性声明为 protected
关键字,可以将属性封装为受保护的属性,只能在类的内部和其派生类中访问。
class Person {
protected name: string;
constructor(name: string) {
this.name = name;
}
}
class Employee extends Person {
private department: string;
constructor(name: string, department: string) {
super(name);
this.department = department;
}
public getDetails(): string {
return `${this.name} works in ${this.department}`;
}
}
const employee = new Employee("Alice", "Sales");
console.log(employee.name); // 错误: 属性“name”受保护,无法访问
console.log(employee.getDetails()); // 输出: "Alice works in Sales"
在上面的例子中,Person
类中的 name
属性被声明为受保护属性,只能在类的内部和其派生类中访问。Employee
类继承了 Person
类,并在其公共方法 getDetails()
中访问了受保护属性。
只读(Readonly)属性
通过将属性声明为 readonly
关键字,可以将属性封装为只读属性,一旦初始化后就不能再修改。
class Person {
readonly name: string;
constructor(name: string) {
this.name = name;
}
}
const person = new Person("Alice");
console.log(person.name); // 输出: "Alice"
person.name = "Bob"; // 错误: 属性“name”为只读属性,无法修改
在上面的例子中,name
属性被声明为只读属性,一旦在构造函数中初始化后,就不能再修改。