本文通過構(gòu)造函數(shù)方法 與 class 進行對比來講解抹镊,這樣會更好理解點
1,定義
class 的本質(zhì)是 function杈笔,它可以看作一個語法糖序六,讓對象原型的寫法更加清晰、更像面向?qū)ο缶幊痰恼Z法
2悠就,函數(shù)的使用(構(gòu)造函數(shù) 與 class)
1千绪,新建
- 構(gòu)造函數(shù)創(chuàng)建實例
function Person(name,age){
this.name = name
this.age = age
}
const constructP = new Person('張小五',21) // {name: "張小五" age: 21}
- class 創(chuàng)建實例
constructor 是類的 構(gòu)造器,每個類梗脾,都有構(gòu)造器
程序員沒有手動指定構(gòu)造器荸型,默認類內(nèi)部有一個隱形的空構(gòu)造器,類似于 constructor(){}
構(gòu)造器作用:每當 new 這個類時候炸茧,必然會優(yōu)先執(zhí)行 構(gòu)造器里的代碼
class Animal{
constructor(name,age){
this.name = name
this.age = age
}
}
const classA = new Bnimal('張小五',10) // {name: "張小五" age: 10}
2瑞妇,靜態(tài)屬性 與 實例屬性
靜態(tài)屬性:直接掛載給構(gòu)造函數(shù)的屬性
實例屬性:通過new出來的實例稿静,訪問到的動態(tài)屬性
// 構(gòu)造函數(shù)
constructP.name // 張小五 動態(tài)屬性
constructP.info= '我是構(gòu)造函數(shù)靜態(tài)屬性'
// class 類
classA.name // 張小五 動態(tài)屬性
class Animal{
static info = '我是class類靜態(tài)屬性'
}
3,掛載的 靜態(tài)方法 與 實例方法
靜態(tài)方法:在函數(shù)原型上辕狰,添加一個靜態(tài)方法
實例方法:在函數(shù)原型上改备,添加一個實例方法
- 構(gòu)造函數(shù)
// 靜態(tài)方法
constructP.show = function () {
console.log('我是面向?qū)ο髵燧d的show靜態(tài)方法')
}
// 實例方法
constructP.prototype.say = function () {
console.log('我是面向?qū)ο髵燧d的say實例方法')
}
- class 類
在class類 上添加一個【實例方法】
在class類 上,通過static 修飾的屬性蔓倍,添加一個【靜態(tài)方法】
class Bnimal{
...... // 此處添加constructor屬性
say () { // 在a的原型上悬钳,查看到該方法
console.log('我是添加在class原型上的方法')
}
static show () { // 在class類 上,通過 static 修飾的屬性偶翅,添加【靜態(tài)方法】
console.log('我是class掛載的show靜態(tài)方法')
}
}
注:類定義不會被提升默勾,這意味著,必須在訪問前對類進行定義倒堕,否則就會報錯灾测。
類中方法不需要 function 關(guān)鍵字爆价;方法間不能加分號
4垦巴,繼承
- class 類
通過 extends 來設置子類繼承了父類元素
直接把子類的方法,添加在父類元素上铭段,通過prototype來獲取實例方法
class PersonSet{
constructor(name,age){
this.name = name
this.age = age
}
say(){ // 子類繼承父類上的實例方法
console.log('打聲招呼唄')
}
}
// 子類繼承了父類元素的屬性
class American extends PersonSet { }
const C = new Chinese('張小五',22)
console.log(C) // {name: "張小五" age: 22}
3骤宣,constructor中的 super 使用
1,為什么 里面要調(diào)用 super序愚?
答:如果子類通過 extends 關(guān)鍵字繼承父類憔披,子類的 constructor 構(gòu)造函數(shù)中,必須優(yōu)先調(diào)用 super()爸吮;
2芬膝,super 是什么東西?
super 是一個函數(shù)形娇,子類的 super 是父類構(gòu)造器 constructor 構(gòu)造器的一個引用
3锰霜,為什么調(diào)用之后,實例上 name 與 age 就變成了 undefined
因為是父類構(gòu)造器的引用桐早,需要傳值癣缅,不傳的話,肯定是undefined
class PersonSet {
constructor(name,age){
this.name = name
this.age = age
}
}
class American extends PersonSet {
constructor(name,age){
super(name,age)
}
}
const A = new American('jack',20)
console.log(A) // American {age: 20,name: "jack"}
4哄酝,為子類掛載獨有的方法或者屬性
class PersonSet{
constructor(name,age){
this.name = name
this.age = age
}
}
class Chinese extends PersonSet {
constructor(name,age,number){
super(name,age)
this.number = number
}
}
const C = new Chinese ('jack',20,'3213221898xxxxxxxx')
console.log(C) // Chinese {name: "jack",age: 20,number:'3213221898xxxxxxxx'}
注:語法規(guī)范友存,在子類中,this 只能放到 super 之后使用
如果所有子類都共享的陶衅,就放到父類屡立,否則直接放到子類中,即可