簡介
- 直接定義的屬性是實例屬性,需要通過對象的實例去訪問
- 使用static開頭的屬性是靜態(tài)屬性(類屬性)没炒,可以直接通過類去訪問
// 使用class關鍵字來定義一個類
/*
* 對象中主要包含了兩個部分:
* 屬性
* 方法
* */
class Person{
/*
* 直接定義的屬性是實例屬性,需要通過對象的實例去訪問:
* const per = new Person();
* per.name
*
* 使用static開頭的屬性是靜態(tài)屬性(類屬性)畜晰,可以直接通過類去訪問
* Person.age
*
* readonly開頭的屬性表示一個只讀的屬性無法修改
* */
// 定義實例屬性
// readonly name: string = '孫悟空';
name = '孫悟空';
// 在屬性前使用static關鍵字可以定義類屬性(靜態(tài)屬性)
// static readonly age: number = 18;
age = 18;
// 定義方法
/*
* 如果方法以static開頭則方法就是類方法猾浦,可以直接通過類去調(diào)用
* */
sayHello(){
console.log('Hello 大家好!');
}
}
const per = new Person();
// console.log(per.name, per.age);
// console.log(Person.age);
構造函數(shù)
- constructor 被稱為構造函數(shù)
- 構造函數(shù)會在對象創(chuàng)建時調(diào)用 也就是new的過程
class Dog{
name: string;
age: number;
// constructor 被稱為構造函數(shù)
// 構造函數(shù)會在對象創(chuàng)建時調(diào)用 也就是new的過程
constructor(name: string, age: number) {
// 在實例方法中捞蚂,this就表示當前當前的實例
// 在構造函數(shù)中當前對象就是當前新建的那個對象
// 可以通過this向新建的對象中添加屬性
this.name = name;
this.age = age;
}
bark(){
// 在方法中可以通過this來表示當前調(diào)用方法的對象
console.log(this.name);
}
}
const dog = new Dog('小黑', 4);
const dog2 = new Dog('小白', 2);
// console.log(dog);
// console.log(dog2);
dog2.bark();
繼承
- 使用繼承后,子類將會擁有父類所有的方法和屬性
- 通過繼承可以將多個類中共有的代碼寫在一個父類中跷究,這樣只需要寫一次即可讓所有的子類都同時擁有父類中的屬性和方法
- 如果在子類中添加了和父類相同的方法姓迅,則子類方法會覆蓋掉父類的方法,這種子類覆蓋掉父類方法的形式,稱為方法重寫
// 定義一個Animal類
class Animal{
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
sayHello(){
console.log('動物在叫~');
}
}
// 定義一個表示狗的類
// 使Dog類繼承Animal類
class Dog extends Animal{
run(){
console.log(`${this.name}在跑~~~`);
}
sayHello() {
console.log('汪汪汪汪队贱!');
}
}
// 定義一個表示貓的類
// 使Cat類繼承Animal類
class Cat extends Animal{
sayHello() {
console.log('喵喵喵喵色冀!');
}
}
const dog = new Dog('旺財', 5);
const cat = new Cat('咪咪', 3);
console.log(dog);
dog.sayHello();
dog.run();
console.log(cat);
cat.sayHello();
super
- 如果在子類中寫了構造函數(shù),在子類構造函數(shù)中必須對父類的構造函數(shù)進行調(diào)用柱嫌,也就是說只要子類中寫了constructor锋恬,那么必須要寫super
- super()其實就是調(diào)用父類的構造函數(shù)
- 在子類的方法中 super就表示當前類的父類
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
sayHello() {
console.log('動物在叫~');
}
}
class Dog extends Animal{
age: number;
constructor(name: string, age: number) {
// 如果在子類中寫了構造函數(shù),在子類構造函數(shù)中必須對父類的構造函數(shù)進行調(diào)用
super(name); // 調(diào)用父類的構造函數(shù)
this.age = age;
}
sayHello() {
// 在子類的方法中 super就表示當前類的父類
//super.sayHello();
console.log('汪汪汪汪编丘!');
}
}
const dog = new Dog('旺財', 3);
dog.sayHello();
抽象類
- 以abstract開頭的類是抽象類与学,抽象類和其他類區(qū)別不大,只是不能用來創(chuàng)建對象嘉抓,抽象類就是專門用來被繼承的類
- 抽象類中可以添加抽象方法
- 抽象方法使用 abstract開頭索守,沒有方法體,抽象方法只能定義在抽象類中抑片,子類必須對抽象方法進行重寫
abstract class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
// 定義一個抽象方法
// 抽象方法使用 abstract開頭卵佛,沒有方法體
// 抽象方法只能定義在抽象類中,子類必須對抽象方法進行重寫
abstract sayHello():void;
}
class Dog extends Animal{
sayHello() {
console.log('汪汪汪汪敞斋!');
}
}
class Cat extends Animal{
sayHello() {
console.log('喵喵喵喵截汪!');
}
}
const dog = new Dog('旺財');
dog.sayHello();
TS可以在屬性前添加屬性的修飾符
- public 修飾的屬性可以在任意位置訪問(修改) 默認值
- private 私有屬性,私有屬性只能在類內(nèi)部進行訪問(修改)植捎,通過在類中添加方法使得私有屬性可以被外部訪問
- protected 受包含的屬性衙解,只能在當前類和當前類的子類中訪問(修改)
getter VS setter
原本屬性可以任意的被修改,將會導致對象中的數(shù)據(jù)變得非常不安全焰枢。通過調(diào)用 set 函數(shù)進行修改蚓峦,并在 set 函數(shù)中對設置進行一些控制,可以放置屬性被任意修改 比如 將 age賦值為一個負數(shù)等
原先
// 定義一個表示人的類
class Person{
// TS可以在屬性前添加屬性的修飾符
private _name: string;
private _age: number;
constructor(name: string, age: number) {
this._name = name;
this._age = age;
}
/*
* getter方法用來讀取屬性
* setter方法用來設置屬性
* - 它們被稱為屬性的存取器
* */
// 定義方法济锄,用來獲取name屬性
// getName(){
// return this._name;
// }
//
// // 定義方法暑椰,用來設置name屬性
// setName(value: string){
// this._name = value;
// }
//
// getAge(){
// return this._age;
// }
//
// setAge(value: number){
// // 判斷年齡是否合法
// if(value >= 0){
// this._age = value;
// }
// }
TS中設置方式
get name(){
// console.log('get name()執(zhí)行了!荐绝!');
return this._name;
}
set name(value){
this._name = value;
}
get age(){
return this._age;
}
set age(value){
// 在方法中可以對變量進行一些設置
if(value >= 0){
this._age = value
}
}
protected
class A{
protected num: number;
constructor(num: number) {
this.num = num;
}
}
class B extends A{
test(){
console.log(this.num);
}
}
const b = new B(123);
// b.num = 33; num 變量只能在類里面訪問 在外面訪問不到
其他書寫形式
/* class C{
name: string;
age: number
// 可以直接將屬性定義在構造函數(shù)中
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}*/
class C{
// 可以直接將屬性定義在構造函數(shù)中
constructor(public name: string, public age: number) {
}
}
const c = new C('xxx', 111);
console.log(c);