面向?qū)ο蟮乃季S特點(diǎn):
1.抽取(抽象)對(duì)象公共的屬性和行為組織(封裝)成一個(gè)類(模板)
2.對(duì)類進(jìn)行實(shí)例化凯力,獲取類的對(duì)象
面向?qū)ο缶幊涛覀兛紤]的是有哪些對(duì)象,按照面向?qū)ο蟮乃季S特點(diǎn),不斷的創(chuàng)建對(duì)象售貌,使用和指揮對(duì)象做事情
總結(jié):類就是創(chuàng)建對(duì)象的模板
對(duì)象:
在JavaScript中,對(duì)象是一組無序的相關(guān)屬性和方法的集
對(duì)象是由屬性和方法組成的:
1.屬性:事物的特征疫萤,在對(duì)象中用屬性來表示
2.方法:事物的行為颂跨,在對(duì)象中用方法來表示
類class:
在ES6中新增了類的概念,可以使用calss關(guān)鍵字聲明一個(gè)類给僵,之后以這個(gè)類來實(shí)例化對(duì)象
1.類抽群恋贰(抽象)了對(duì)象的公共部分详拙,它泛指某一大類
2.對(duì)象特指某一個(gè),通過類實(shí)例化一個(gè)具體對(duì)象
創(chuàng)建類
class Name {}
let name = new Name() // 注意:類必須使用new實(shí)例化對(duì)象
類constructor 構(gòu)造函數(shù):
constructor()方法是類的構(gòu)造函數(shù)(默認(rèn)方法)蔓同,用于傳遞參數(shù)饶辙,返回實(shí)例對(duì)象,通過new命令生成對(duì)象實(shí)例時(shí)斑粱,自動(dòng)調(diào)用該方法弃揽。如果沒有定義constructor()方法,類內(nèi)部自動(dòng)給我們創(chuàng)建一個(gè)constructor()方法
// 使用關(guān)鍵字class創(chuàng)建一個(gè)明星類
class Star {
constructor(name) {
this.name = name
}
}
// 使用new關(guān)鍵字創(chuàng)建對(duì)象
let ldh = new Star('劉德華')
console.log(ldh.name) // 劉德華
// 1. 通過class關(guān)鍵字創(chuàng)建類则北,類名我們還是習(xí)慣性定義首字母大寫
// 2.類里面有個(gè)constructor函數(shù)(構(gòu)造函數(shù))矿微,可以接受傳遞過來得參數(shù),同時(shí)返回實(shí)例對(duì)象
// 3.只要new生成實(shí)例時(shí)尚揣,就是自動(dòng)調(diào)用 contructor這個(gè)函數(shù)涌矢,如果我們不寫這個(gè)函數(shù),類也會(huì)自動(dòng)生成constructor函數(shù)
// 4.生成實(shí)例new不可省略
// 5.最后注意語法規(guī)范快骗,創(chuàng)建類娜庇,類名后面不要加小括號(hào),生成實(shí)例方篮,類名后面加小括號(hào)名秀,構(gòu)造函數(shù)不需要加function
在類中添加方法
class Star {
constructor(name) {
this.name = name
}
sing(song) {
console.log(this.name + '唱' + song)
}
}
// 使用new關(guān)鍵字創(chuàng)建對(duì)象
let ldh = new Star('劉德華')
console.log(ldh.name) // 劉德華
ldh.sing('十七歲') // 劉德華唱十七歲
// 1.類里面所有函數(shù)不需要寫function關(guān)鍵字
// 2.多個(gè)函數(shù)之間不需要用逗號(hào)分隔
類的繼承
1.現(xiàn)實(shí)中的繼承:子承父業(yè),比如我們都繼承了父親的姓
2.程序中的繼承:子類可以繼承父類的一些屬性與方法
class Father {}
class Son extends Father {} // 子類繼承父類屬性與方法用extends關(guān)鍵字
class Father {
constructor(x, y) {
this.x = x
this.y = y
}
sum() {
console.log(this.x + this.y)
}
say() {
return '我是爸爸'
}
}
class Son extends Father {
construct(x, y) {
super(x, y)
this.x = x
this.y = y
}
say() {
console.log(super.say() + '的兒子藕溅!')
}
}
let son = new Son(1, 2)
son.sum() // 3
son.say() // 我是爸爸的兒子
// 1.super關(guān)鍵字用于訪問和調(diào)用父類上的函數(shù)匕得,可以調(diào)用父類的構(gòu)造函數(shù),也可以調(diào)用父類的普通函數(shù)
// 2.父類中sum方法中this指向父類巾表,所以其實(shí)子類繼承的sum方法this指向是父類汁掠,若沒有super關(guān)鍵字把子類的x和y參數(shù)傳遞給父類,則會(huì)報(bào)錯(cuò)
// 3.super關(guān)鍵字要寫到子類的constructor函數(shù)里的最前端
繼承中的屬性或方法查找原則-就近原則
1.繼承中攒发,如果實(shí)例化子類輸出一個(gè)方法调塌,先看子類有沒有這個(gè)方法,如果有就先執(zhí)行子類的
2.繼承中惠猿,如果子類里面沒有羔砾,就去查找父類有沒有這個(gè)方法,如果有偶妖,就執(zhí)行父類的這個(gè)方法