1.我理解的類
類可以理解成為一個模板,通過這個模板可以實例化某一個具體對象
比如說:我們定義一個動物類,
通過這個動物模板可以實例化成為貓或者其他具體的動物
2.類的基本使用
我們需要創建一個動物類;
這個動物有姓名、【默認值小可愛,字符串類型】
年齡、【默認值 20,數字類型】
性別、【字符串類型】
體重、【數字類型】
愛好【愛好可有可無,如果有必須是一個數組類型的】
這個動物類還有一個say的實例方法
下面我們就開始實現
class Animails {
name: string
age: number
gender: string
weight: string
likes?: Array<any>
//愛好這個屬性可有可無,如果有必須是數組類型
// 定義構造函數:為了將來實例化對象的時候,
// 構造器直接對屬性進行初始化
// 需要給名稱默認值小可愛、年齡默認值age=20
constructor(
name: string = '小可愛',
age: number = 20,
gender: string,
weight: string,
likes?: Array<any>
) {
// 初始化屬性中的數據
this.name = name
this.age = age
this.gender = gender
this.weight=weight
}
// 定義實例方法
say() {
console.log(
`大家好我是${this.name},
今年${this.age}歲了,
性別:${this.gender},
體重:${this.weight},
`);
}
}
// 實例化對象
let pig = new Animails('豬豬俠', 10, '男', '30kg');
pig.say();//調用實例方法

3.實例化類的注意點
當類中的屬性都有默認值時,
實例化對象的時候,
可以不用進行進行初始化。
類中的屬性如果沒有默認值,不是可選屬性。必須一一賦值(初始化)
就是說:
我們必須對構造器中的屬性進行一一賦值
除非構造器中有默認值
class Animails {
name: string
age: number
constructor(
name: string = '小可愛',
age: number = 20,
) {
// 初始化屬性中的數據
this.name = name
this.age = age
}
// 定義實例方法
say() {
console.log( `大家好我是${this.name}, 今年${this.age}歲了, `);
}
}
// 實例化對象
let pig = new Animails();
pig.say();//調用實例方法
4.類與類之間的繼承
A類繼承了B類,那么A類叫做子類;B類叫做基類
子類--->又叫派生類
基類--->又叫父類或者超類
下面這個例子我們將子類MySon將會去繼承Father父類。
子類有屬於自己的方法sonsay;
子類可以去調用父類的方法super.say('子類');
同時我們在子類中將會去重寫父類的方法
// 我們定義了一個超類【父類】
class Father {
// 定義屬性
name: string
age: number
// 定義構造函數
constructor(name: string, age: number) {
// 初始化屬性中的數據
this.name = name
this.age = age
}
// 定義實例方法
say(str:string) {
console.log( `大家好我是${this.name}, 今年${this.age}歲了,${str}呼喊的我 `);
}
}
// 子類去繼承了父類
class MySon extends Father {
// constructor中的參數必須要滿足父類。
// 除非父類有默認參數或者父類中的屬性不是必須屬性。
constructor(name: string, age: number) {
// super調用父類中的構造函數
super(name,age)
}
// 子類中自己的實例方法
sonsay() {
console.log('我是子類哈哈');
//調用父類中的實例方法
super.say('子類');
}
// 重寫父類的方法
say(name:string) {
console.log(`我重寫了父類的方法我是${name}`)
}
}
// 進行實例化
let xiaoming = new MySon('小明', 19);
// 進行方法調用
xiaoming.sonsay();
xiaoming.say('小明');

5.修飾符的理解
修飾符:主要用於描述類中的成員(屬性、方法、構造函數,)的可訪問行
當一個類的成員變量沒有修飾的時候,
默認的就是 public 進行修飾。
外界是可以進行訪問的。任何位置都可以訪問類中的成員
private 屬性【只能夠】在父類的內部直接進行訪問;
class Person{
age:10
// private 屬性只能夠 在類的內部 進行訪問;
private name = "張三"
say() {
console.log("我的名字是"+this.name)
}
}
6.private的理解
如果父類定義的私有屬性或者方法的時候,
那么繼承的子類是不可以訪問父類中的私有屬性和私有方法
在實例化的時候也是不可以訪問私有屬性和私有方法
子類繼承父類后
訪問父類屬性通過this.屬性名
調用父類的方法 this.方法名
下面我們看一下:
子類是否可以訪問父類中的私有屬性?
實例化后是否可以訪問父類中的私有屬性?
class Person {
age: 10;
// private 屬性只能夠在類的內部進行訪問;
private name = "張三";
say() {
//內部訪問是ok的哈
console.log("我的名字是" + this.name);
}
}
class Children extends Person {
sayage() {
console.log('訪問父類屬性年齡',this.age)
}
// 下面這種訪問是非法的會報錯
sayname() {
console.log('訪問父類屬性姓名',this.name)
}
}
var xm = new Children();
xm.say();//我的名字是張三
// 報錯,因為name是父類私有的,
// 實例化的時候不能夠進行訪問
console.log( xm.name )
7.protected 的理解
protected修飾的屬性和方法是受保護的,
只能夠在父類和其子類中訪問。
實例化后是不能夠訪問protected所修飾的屬性和方法
class Person {
protected age:string
constructor(age:string) {
this.age=age
}
say() {
console.log("我的年齡是" + this.age);
}
}
// 繼承父類
class Children extends Person {
callPar() {
super.say(); //super 可以調用父類中的屬性方法
}
hello() {
console.log("我今年" + this.age);
}
}
var xm = new Children('10');
xm.hello(); //我今年10
<!-- 提示 屬性“age”受保護,只能在類“Person”及其子類中訪問 -->
console.log(xm.age)