1、訪問類型 private protected public
- public 允許在類的內(nèi)外被調(diào)用
class Person {
name: string; // 默認為 public
syaHi() {
console.log(this.name);
}
}
const person = new Person();
person.name = 'hzp'; // 類的外部可以調(diào)用
person.syaHi(); // 類的外部可以調(diào)用
- private 只允許在類的內(nèi)部調(diào)用
class Person {
private name: string; // private 類型
syaHi() {
console.log(this.name);
}
}
const person = new Person();
person.name = 'hzp'; // 不被允許,因為name在類內(nèi)定義為private類型
person.syaHi();
class Person {
firstName: string; // public類型
private lastName = 'Huang'; // private類型
syaHi() {
console.log(this.firstName + this.lastName);
}
}
const person = new Person();
person.firstName = 'Zhenpeng'; // 可以賦值,因為firstName是public類型
person.syaHi(); // ZhenpengHuang
- protected 允許在類內(nèi)及繼承的子類中使用
class Person {
protected name: string;
public syaHi() {
this.name; // 可以調(diào)用,protected允許在內(nèi)部和子類調(diào)用
console.log('hi');
}
}
class Teacher extends Person {
public sayBye() {
this.name; // 可以調(diào)用,protected允許在內(nèi)部子類調(diào)用
}
}
const person = new Person();
person.name = 'Zhenpeng'; // 不可以在類外部調(diào)用
person.syaHi();
2、constructor
constructor在類被實例化的時候被調(diào)用,可以接收參數(shù)
// 傳統(tǒng)寫法
class Person {
public name: string;
constructor(name: string) {
this.name = name;
}
}
const person = new Person('Hzp');
console.log(person.name); // Hzp
上面的寫法和下面這一種是一樣的,簡寫:
// 簡化寫法
class Person {
constructor(public name: string) {}
}
const person = new Person('Hzp');
console.log(person.name); // Hzp
class Person {
constructor(public name: string) {}
}
class Teacher extends Person {
sayHi() {
console.log(this.name);
}
}
const teacher = new Teacher('hzp');
teacher.sayHi(); // hzp
錯誤寫法:
class Person {
constructor(public name: string) {}
}
class Teacher extends Person {
constructor(age: number) { // 報錯,因為繼承了父類,父類的構(gòu)造器需要參數(shù)
}
}
const teacher = new Teacher(28);
正確寫法:
class Person {
constructor(public name: string) {}
}
class Teacher extends Person {
constructor(public age: number) {
super('Hzp');
}
}
const teacher = new Teacher(25);
console.log(teacher.age); // 25
console.log(teacher.name); // Hzp
當繼承時,如果子類有
contructor構(gòu)造器的話,就算父類沒有contructor構(gòu)造器,也需要在子類contructor構(gòu)造器中調(diào)用super(),如果父類構(gòu)造器有參數(shù)的話,要在super方法中傳遞進去。
class Person {
}
class Teacher extends Person {
constructor(public age: number) {
super(); // super也要被調(diào)用,不然會報錯
}
}
3、readonly只讀屬性
class Person {
public readonly name: string;
constructor(name: string) {
this.name = name;
}
}
const person = new Person('Hzp');
console.log(person.name);
person.name = 'Huang'; // Cannot assign to 'name' because it is a read-only property.name為只讀屬性,不能修改