面向?qū)ο笳Z言特性:
1.封裝 ?2.繼承 3.多態(tài)(父類引用指向子類實例)
javascript得到對象的方法:
1.通過new Object得到 ? 例:var 變量 = new Object()走净;
使用這種定義的方式,雖然可以定義一個對象,但是因為沒有類的約束黄痪,所以無法實現(xiàn)重復(fù)使用誉察。
2.使用json得到 ? var 變量 ={ }域帐;
使用json方法實現(xiàn)痒谴,和new Object 一樣存在對象不能重用的缺陷
3.使用工廠模式得到
例: function createOb (name,age){
var o=new Object();
o.name=name;
o.age=age;
o.say=function(){
alert("我的名字是"+this.name+"我今年"+this.age+)稚铣;
}
return o;
}
var p1=createOb("小明",18);
p1.say();
var p2=createOb("剛子",20);
p2.say();
使用工廠模式解決代碼的冗余問題箱叁。
使用了工廠模式定義了對象,這樣就很好的解決了對象無法重用的問題惕医,但是此時又存在了另一個問題耕漱,就是我們無法判斷得到的對象的類型,如typeof或者instanceof來判斷類型抬伺,僅僅得到一個Object類型螟够,多以推出了基于構(gòu)造函數(shù)的方式。
4.使用構(gòu)造函數(shù)來創(chuàng)建一個對象峡钓。
使用構(gòu)造函數(shù)得到妓笙;(解決了無法判斷所得到類型的問題,但是形成了閉包函數(shù)能岩,造成不必要的內(nèi)存占用)注:如果把構(gòu)造函數(shù)中的方法函數(shù)寞宫,轉(zhuǎn)移到構(gòu)造函數(shù)外,會擴大方法函數(shù)的作用域拉鹃,不利于開發(fā)辈赋!
封裝-javascript的原型(prototype)
原型:
原型是js中非常特殊的一個對象,當(dāng)一個函數(shù)創(chuàng)建之后膏燕,會隨之產(chǎn)生一個原型對象钥屈,當(dāng)通過這個函數(shù)的構(gòu)造函數(shù)創(chuàng)建 了一個具體的對象 之后,在這個 具體對象中就會有一個屬性指向 原型坝辫。
常見的原型檢測方式:
原型重寫:
在上面的寫法中篷就,我們已經(jīng)解決了大量的問題,使用原型阀溶,但是如果我們的對象中存在大量的屬性或者方法的時候腻脏,使用上面的方式鸦泳,感覺要寫大量的【對象.prototype.屬性名】這樣的代碼感覺不是很好银锻,那么我們就可以用json的方式來寫:
封裝--原型創(chuàng)建對象:
因為原型存在永品,我們實現(xiàn)了對象的封裝,但是這種封裝也同樣可能存在問題的击纬。
1鼎姐,我們無法像使用構(gòu)造函數(shù)的那樣將屬性傳遞用于設(shè)置值
2,當(dāng)屬性中有引用類型更振,可能存在變量值的重復(fù)
如下代碼:
終極方案—基于組合的對象定義
為了解決原型所帶來的問題炕桨,需要通過組合構(gòu)造函數(shù)和原型來實現(xiàn)對象的創(chuàng)建將:屬性在構(gòu)造函數(shù)中定義,將方法在原型中定義肯腕,這種有效集合了兩者的優(yōu)點献宫,是目前最為常用的一種方式。
原型鏈實現(xiàn)繼承:
當(dāng)子類的原型指向父類的對象后实撒,子類就繼承了父親姊途,實現(xiàn)了繼承,這就是基于原型鏈的繼承知态,我們可以通過內(nèi)存模型來分析這種繼承捷兰。
但是使用原型鏈實現(xiàn)繼承要注意以下一些問題:
1,不要在設(shè)定了原型鏈之后负敏,再原型重寫
2贡茅,一定要在原型鏈賦值之后才能添加或者覆蓋方法
父類方法的覆蓋(重寫)
當(dāng)子類繼承父類后,子類如果認(rèn)為父類的方法不能滿足自己或者不太滿意父類的方法其做,可以使用與父類同名 的方法來覆蓋(也叫重寫)父類方法顶考。
注意:javascript中存在重寫,但是沒有重載妖泄。
原型鏈繼承的缺陷
原型鏈繼承存在的缺陷就是:
1村怪,無法從子類中調(diào)用父類的構(gòu)造函數(shù),這樣就沒有辦法把子類中 屬性賦值給父類浮庐。
2甚负,父類中屬性是在子類的原型中的,這違背了我們前面所說的封裝的理念(屬性在對象中审残,方法在原型中)梭域,會出現(xiàn)前面值的混淆問題。
所以我們一般都不會使用單純的原型鏈來實現(xiàn)繼承搅轿。
extends
在ES6中繼承的實現(xiàn)使用extends來實現(xiàn):