類的基本實現
- 類的成員屬性都是實例屬性,而不是原型屬性,類的成員方法都是原型方法。
class Dog {constructor(name: string) {this.name = name;}name: string;run() {}
}console.log(Dog.prototype);
let dog = new Dog("wangwang");
console.log(dog);
- 實例的屬性必須具有初始值或者在構造函數中賦值,否則會報錯。
class Dog {constructor(name: string) {// this.name = name;}name: string = "wangwang";run() {}
}
類的繼承
class Husky extends Dog {constructor(name: string, color: string) {super(name);// this 需在 super 之后this.color = color;}color: string;
}
類的成員修飾符
1. public
公有成員,類的所有屬性默認都是 public,對所有人可見
class Dog {constructor(name: string) {this.name = name;}// 顯示聲明public name: string;run() {}
}
2. private
類的私有成員,只能在類的本身調用,不能被類的實例調用,也不能被子類調用。
class Dog {constructor(name: string) {this.name = name;}name: string;private privateMethod() {}
}let dog = new Dog("wangwang");
// 下面會報錯:屬性“privateMethod”為私有屬性,只能在類“Dog”中訪問。
console.log(dog.privateMethod());class Husky extends Dog {constructor(name: string, color: string) {super(name);// this 需在 super 之后this.color = color;// 下面會報錯:屬性“privateMethod”為私有屬性,只能在類“Dog”中訪問。this.privateMethod();}color: string;
}
給構造函數添加 private, 這個類不能被實例化,也不能被繼承。
class Dog {private constructor(name: string) {this.name = name;}name: string;run() {}private privateMethod() {}
}// 下面報錯:類“Dog”的構造函數是私有的,僅可在類聲明中訪問。
let dog = new Dog("wangwang");// 下面報錯:無法擴展類“Dog”。類構造函數標記為私有。
class Husky extends Dog {constructor(name: string, color: string) {super(name);this.color = color;}color: string;
}
3. protected
受保護成員,只能在類的本身和子類中調用,不能被類的實例調用。
class Dog {constructor(name: string) {this.name = name;}name: string;protected protectedMethod() {}
}
let dog = new Dog("wangwang");
// 下面報錯:屬性“protectedMethod”受保護,只能在類“Dog”及其子類中訪問。
console.log(dog.protectedMethod());class Husky extends Dog {constructor(name: string, color: string) {super(name);this.color = color;// 子類調用不報錯this.protectedMethod();}color: string;
}
給構造函數添加 protected, 這個類不能被實例化,只能被繼承,相當于聲明了一個基類。
4. readonly
只讀屬性,一定要被初始化,不能被修改。
class Dog {constructor(name: string) {this.name = name;}name: string;run() {}readonly legs: number = 4;
}
構造函數的參數也可以添加修飾符,作用就是自動將參數變為實例的屬性,可以省略在類中的定義
class Husky extends Dog {constructor(name: string, public color: string) {super(name);this.color = color;}// 下面這個就可以省略// color: string;
}
5. static
類的靜態成員,只能通過類名來調用,不能被類的實例調用。也可以被繼承。
class Dog {constructor(name: string) {this.name = name;}name: string;run() {}static food: string = "bones"
}let dog = new Dog("wangwang");
// 可以
console.log(Dog.food); // bones
// 下面報錯
console.log(dog.food);class Husky extends Dog {constructor(name: string, public color: string) {super(name);this.color = color;}
}// 可以
console.log(Husky.food); // bones