本文已參與好文召集令活動,點擊查看:後端、大前端雙賽道投稿,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();//調用實例方法
複製代碼
當類中的屬性都有默認值時,
實例化對象的時候,
能夠不用進行進行初始化。
類中的屬性若是沒有默認值,不是可選屬性。必須一一賦值(初始化)
就是說:
咱們必須對構造器中的屬性進行一一賦值
除非構造器中有默認值
複製代碼
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();//調用實例方法
複製代碼
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('小明');
複製代碼
修飾符:主要用於描述類中的成員(屬性、方法、構造函數,)的可訪問行
當一個類的成員變量沒有修飾的時候,
默認的就是 public 進行修飾。
外界是能夠進行訪問的。任何位置均可以訪問類中的成員
private 屬性【只可以】在父類的內部直接進行訪問;
class Person{
age:10
// private 屬性只可以 在類的內部 進行訪問;
private name = "張三"
say() {
console.log("個人名字是"+this.name)
}
}
複製代碼
若是父類定義的私有屬性或者方法的時候,
那麼繼承的子類是不能夠訪問父類中的私有屬性和私有方法
在實例化的時候也是不能夠訪問私有屬性和私有方法
子類繼承父類後
訪問父類屬性經過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 )
複製代碼
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)
複製代碼