一:js面向?qū)ο缶幊?/h2>
在es5中我們是這樣去寫面向?qū)ο蟮木幊谭绞降模?/p>
function Person(name) {
//構(gòu)造函數(shù)里面的方法和屬性
this._name = name;
this.getName = function () {
console.log(this._name);
};
this.setName = function (name) {
this._name = name;
};
}
let p = new Person("張三");
p.getName(); // 張三
p.setName("李四");
p.getName(); // 李四
在es6中营袜,提供了新的方式去書寫面向?qū)ο缶幊蹋@種方式更加接近面向?qū)ο蟮臅鴮懛绞窖肜眨旧碇皇且环N語法糖:
// 定義類
class Person {
//類的構(gòu)造函數(shù)斑鼻,實例化的時候執(zhí)行萤彩,new的時候執(zhí)行
constructor(name) {
this._name = name;
}
getName() {
console.log(this._name);
}
setName(name) {
this._name = name
}
}
let p = new Preson('張三')
p.getName(); // 張三
p.setName('李四');
p.getName(); // 李四
二:面向?qū)ο蟮娜筇卣?/h2>
三大特征分別為:封裝,繼承和多態(tài)
1:封裝
我們平時所用的方法和類都是一種封裝予权,當(dāng)我們在項目開發(fā)中扫腺,遇到一段功能的代碼在好多地方重復(fù)使用的時候斧账,我們可以把他單獨封裝成一個功能的方法嗓袱,這樣在我們需要使用的地方直接調(diào)用就可以了。
2:繼承
繼承在我們的項目開發(fā)中主要使用為子類繼承父類,下面是es6繼承的書寫方法
class Father {
constructor(name) {
this._name = name;
}
//實例方法,通過實例對象調(diào)用
getName() {
console.log(this._name);
}
// 靜態(tài)方法不會被繼承,并且是通過類名去調(diào)用的
static hitXiaoMing() {
console.log("打小明")
}
}
class Son extends Father {
constructor(name, age) {
//實例化子類的時候把子類的數(shù)據(jù)傳給父類(這里的super必須有烈拒,super里的參數(shù)是所繼承的父類實例化所需要的數(shù)據(jù))
super(name);
this._age = age;
} }
var DaMing = new Father('大明');
Father.hitXiaoMing(); //打小明
DaMing.getName(); //大明
var XiaoMing = new Son('小明',15);
XiaoMing.getName(); //小明
:繼承會繼承父類的實例屬性和實例方法,并不會繼承靜態(tài)屬性和靜態(tài)方法诞吱,并且靜態(tài)方法只能通過類名去調(diào)用。
三:多態(tài)
多態(tài)的具體表現(xiàn)為方法重載和方法重寫:
方法重載:重載是指不同的函數(shù)使用相同的函數(shù)名,但是函數(shù)的參數(shù)個數(shù)或類型不同暴浦。調(diào)用的時候根據(jù)函數(shù)的參數(shù)來區(qū)別不同的函數(shù)
方法重寫:重寫(也叫覆蓋)是指在派生類中重新對基類中的虛函數(shù)(注意是虛函數(shù))重新實現(xiàn)飞几。即函數(shù)名和參數(shù)都一樣屑墨,只是函數(shù)的實現(xiàn)體不一樣
下面我們根據(jù)上面的例子在添加一個work的方法說明一下方法重寫:
class Father {
constructor(name) {
this._name = name;
}
//實例方法,通過實例對象調(diào)用
getName() {
console.log(this._name);
}
work() {
console.log('我的工作是累死累活,賺錢養(yǎng)家')
}
// 靜態(tài)方法不會被繼承,并且是通過類名去調(diào)用的
static hitXiaoMing() {
console.log("打小明")
}
}
class Son extends Father {
constructor(name, age) {
//實例化子類的時候把子類的數(shù)據(jù)傳給父類(這里的super必須有,super里的參數(shù)是所繼承的父類實例化所需要的數(shù)據(jù))
super(name);
this._age = age;
}
work() {
console.log('我的工作是好好學(xué)習(xí),天天向上谨垃。')
}
}
var DaMing = new Father('大明');
DaMing.work() // 我的工作是累死累活,賺錢養(yǎng)家易核。
var XiaoMing = new Son('小明',15);
XiaoMing.work(); // 我的工作是好好學(xué)習(xí),天天向上饵史。
以上我們重寫了父類的work()方法。
三大特征的優(yōu)點:
封裝:封裝的優(yōu)勢在于定義只可以在類內(nèi)部進(jìn)行對屬性的操作,外部無法對這些屬性指手畫腳,要想修改鞋诗,也只能通過你定義的封裝方法;
繼承:繼承減少了代碼的冗余投剥,省略了很多重復(fù)代碼师脂,開發(fā)者可以從父類底層定義所有子類必須有的屬性和方法,以達(dá)到耦合的目的江锨;
多態(tài):多態(tài)實現(xiàn)了方法的個性化,不同的子類根據(jù)具體狀況可以實現(xiàn)不同的方法糕篇,光有父類定義的方法不夠靈活啄育,遇見特殊狀況就捉襟見肘了
轉(zhuǎn)載于 https://www.cnblogs.com/zhengyufeng/p/10992972.html