1啼肩、訪(fǎng)問(wèn)類(lèi)型 private protected public
- public 允許在類(lèi)的內(nèi)外被調(diào)用
class Person {
name: string; // 默認(rèn)為 public
syaHi() {
console.log(this.name);
}
}
const person = new Person();
person.name = 'hzp'; // 類(lèi)的外部可以調(diào)用
person.syaHi(); // 類(lèi)的外部可以調(diào)用
- private 只允許在類(lèi)的內(nèi)部調(diào)用
class Person {
private name: string; // private 類(lèi)型
syaHi() {
console.log(this.name);
}
}
const person = new Person();
person.name = 'hzp'; // 不被允許,因?yàn)閚ame在類(lèi)內(nèi)定義為private類(lèi)型
person.syaHi();
class Person {
firstName: string; // public類(lèi)型
private lastName = 'Huang'; // private類(lèi)型
syaHi() {
console.log(this.firstName + this.lastName);
}
}
const person = new Person();
person.firstName = 'Zhenpeng'; // 可以賦值,因?yàn)閒irstName是public類(lèi)型
person.syaHi(); // ZhenpengHuang
- protected 允許在類(lèi)內(nèi)及繼承的子類(lèi)中使用
class Person {
protected name: string;
public syaHi() {
this.name; // 可以調(diào)用,protected允許在內(nèi)部和子類(lèi)調(diào)用
console.log('hi');
}
}
class Teacher extends Person {
public sayBye() {
this.name; // 可以調(diào)用,protected允許在內(nèi)部子類(lèi)調(diào)用
}
}
const person = new Person();
person.name = 'Zhenpeng'; // 不可以在類(lèi)外部調(diào)用
person.syaHi();
2楼肪、constructor
constructor
在類(lèi)被實(shí)例化的時(shí)候被調(diào)用,可以接收參數(shù)
// 傳統(tǒng)寫(xiě)法
class Person {
public name: string;
constructor(name: string) {
this.name = name;
}
}
const person = new Person('Hzp');
console.log(person.name); // Hzp
上面的寫(xiě)法和下面這一種是一樣的,簡(jiǎn)寫(xiě):
// 簡(jiǎn)化寫(xiě)法
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
錯(cuò)誤寫(xiě)法:
class Person {
constructor(public name: string) {}
}
class Teacher extends Person {
constructor(age: number) { // 報(bào)錯(cuò),因?yàn)槔^承了父類(lèi)邑闺,父類(lèi)的構(gòu)造器需要參數(shù)
}
}
const teacher = new Teacher(28);
正確寫(xiě)法:
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
當(dāng)繼承時(shí),如果子類(lèi)有
contructor
構(gòu)造器的話(huà)棕兼,就算父類(lèi)沒(méi)有contructor
構(gòu)造器陡舅,也需要在子類(lèi)contructor
構(gòu)造器中調(diào)用super()
,如果父類(lèi)構(gòu)造器有參數(shù)的話(huà)伴挚,要在super方法中傳遞進(jìn)去靶衍。
class Person {
}
class Teacher extends Person {
constructor(public age: number) {
super(); // super也要被調(diào)用,不然會(huì)報(bào)錯(cuò)
}
}
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為只讀屬性摊灭,不能修改