摘要:熟悉面向?qū)ο缶幊痰亩贾?,面向?qū)ο缶幊套钪匾脑瓌t之一從外部接口劃分內(nèi)部接口。所以,面向?qū)ο缶幊叹皖愃朴谄囈粯印?/p>
熟悉面向?qū)ο缶幊痰亩贾?,面向?qū)ο缶幊套钪匾脑瓌t之一 - 從外部接口劃分內(nèi)部接口。也就是說,針對某一類事物,我們其實并不是那么在乎其內(nèi)部究竟是怎樣去實現(xiàn)的,只關(guān)心怎樣使用而已。
為了理解這點,讓我們先來看看現(xiàn)實生活中的列子。通常,我們使用的設(shè)備非常復(fù)雜。但是從外部接口界定內(nèi)部接口允許使用它們沒有什么問題。列如一輛汽車。從外面看主要有:輪子、車身、車頂、方向盤等。
但是,內(nèi)部...
有許多的細(xì)節(jié),但是我們并不用去知道這些細(xì)節(jié),也可以很好地開車車。
汽車非常可靠,不是嗎?我們可以使用很多年,只有在出現(xiàn)問題時才能使用它 - 進(jìn)行維修。汽車的可靠性和使用的簡單性在于隱藏內(nèi)部細(xì)節(jié)。
如果我們從汽車上取下發(fā)動機(jī),那么使用它將會復(fù)雜得多(安裝在哪?),并且危險(它可以電擊)。
所以,面向?qū)ο缶幊叹皖愃朴谄囈粯印?/p> 內(nèi)部和外部接口
在面向?qū)ο蟮木幊讨?,屬性和方法可以分為兩組:
內(nèi)部接口-方法和屬性,可以從類的其他方法訪問,但不能從外部訪問
外部接口-方法和屬性,也可以從外部訪問
如果我們繼續(xù)與汽車進(jìn)行類比 - 內(nèi)部隱藏的部分:發(fā)動機(jī)、變速器、半軸等 - 是其內(nèi)部接口。對于對象的運行,內(nèi)部接口是非常有用的,其細(xì)節(jié)互相使用。例如,彈性元件連接到減震器。
但是從外面看,汽車被外層車殼保護(hù)著,所以沒有人可以接觸到。細(xì)節(jié)隱藏且無法訪問。我們可以通過外部接口使用它的功能。所以,我們在使用一個對象的時候,并不關(guān)心它內(nèi)部是怎樣工作的。
在JavaScript中,有兩種類型的對象字段(屬性和方法):
公共的:隨處都可訪問,它們包含外部接口,我們在開發(fā)中一直常用的也就是公共的屬性和方法了
私有的:僅在類的內(nèi)部可訪問,主要用于內(nèi)部接口
在許多其他語言中,還存在“受保護(hù)”字段:只能從類內(nèi)部訪問和擴(kuò)展它們。它們對內(nèi)部接口也很有用。它們在某種意義上比私有更廣泛,因為我們通常希望通過繼承類來獲取和訪問它們。
受保護(hù)的字段不是在JavaScript語言級別上實現(xiàn)的,但實際上它們非常方便,我們也可以模擬地去實現(xiàn)它們?,F(xiàn)在我們用JavaScript來制作一臺具有這些類型屬性的汽車。
class MBWCar{ oilAmount = 0; // the amount of oil inside constructor(power){ this.power = power alert( `Created a mbw-car, power: ${power}` ); } } // create the mbw car let mbwCar = new MBWCar(100) // oil water mbwCar.oilAmount = 200
從上面的代碼可以看出oilAmount與power這兩個屬性是公共的,我們可以在外部輕易地設(shè)置以及獲取它們。
讓我們將oilAmount屬性更改為protected以對其進(jìn)行更多控制。例如,我們不希望任何人將其設(shè)置為零以下。
受保護(hù)的屬性通常以下劃線_為前綴這不是在語言層面強(qiáng)制去執(zhí)行,但咱們程序員之間有一個眾所周知的慣例,即不應(yīng)該從外部訪問這些屬性和方法。
class MBWCar{ _oilAmount = 0; constructor(power){ this._power = power } set oilAmount(value){ if (value < 0) throw new Error("Negative oil"); this._oilAmount = value } get oilAmount(){ return this._oilAmount } } // create the mbw car let mbwCar = new MBWCar(100) // oil water mbwCar.oilAmount = -10 //Error Negative oil
現(xiàn)在訪問受到控制,因此將油量設(shè)置為零以下將失敗。
那么我們可以把power屬性設(shè)置為只讀屬性,這在一些程序開發(fā)中也有類似的需要,某些屬性只讀不可更改其值。
class MBWCar{ constructor(power){ this._power = power } get power(){ return this._power } } // create the mbw car let mbwCar = new MBWCar(100) alert(`Power is: ${mbwCar.power}W`); // Power is: 100W mbwCar.power = 25 // Error (no setter)getter/setter方法
class Car{ _oilMount = 0; setOilMount(value){ if(value<0) throw Error("Negative oil") this._oilMount = value } getOilMount() { return this._oilMount; } } let mbw = new Car() mbw.setOilMount(100); alert(mbw.getOilMount());
受保護(hù)的屬性是可以繼承的
如果我們繼承類MBWCar擴(kuò)展Car,那么沒有什么能阻止我們從新類的方法中訪問this._oilMount 或this._power屬性。 所以受保護(hù)的屬性是可以繼承的,不像接下來我們所說的私有屬性。私有字段
這是JavaScript后面新增的一個針對類屬性的語法。JavaScript引擎不支持,或者部分支持,需要進(jìn)行polyfilling
在JavaScript的提議中,有一個已完成的標(biāo)準(zhǔn),為私有屬性和方法提供語言級支持。
私有的私有字段與#開頭,僅在類的內(nèi)部可進(jìn)行訪問.
class Car{ #oilLiMit = 100; #checkOil(value){ if(value<0) throw Error(`Negative oil`) if (value > this.#waterLimit) throw new Error("Too much oil"); } } let car = new Car(); // can"t access privates from outside of the class car.#checkOil(); // Error car.#waterLimit = 1000; // Error class BWMCar extends Car{ method() { alert( this.#oilLiMit ); // Error: can only access from Car } }
私有字段不能夠通過this[name]去訪問
class User{ sayHi(){ let filedName = "Darkcod" alert(`Hello,${this.filedName}`) //Hello,undefined } } new User().sayHi()
總結(jié):
面向?qū)ο缶幊套钪匾脑瓌t之一 - 從外部接口劃分內(nèi)部接口,這就涉及到屬性和方法的可訪問范圍度
在面向?qū)ο缶幊讨?,可通過private、protected、public來對類的屬性和方法進(jìn)行限制,例如你從你父親那里繼承了一些屬性,但你父親其他屬性不像被你繼承到等。
在JavaScript中,受保護(hù)的屬性和方法名以_開頭,私有的屬性和方法名以#開頭
面向?qū)ο缶幊痰囊粋€較大的好處之一是我們不必理解其內(nèi)部實現(xiàn),依然可以很好地去進(jìn)行編程開發(fā),例如:一個U盤,我們想要將電腦中的某些文件拷貝到它那里進(jìn)行存儲,這時候我們并不關(guān)心U盤的內(nèi)部是這樣形成的,我們只知道通過USB口插入即可完成拷貝的工作
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/105751.html
摘要:添加了可選的靜態(tài)類型注意并不是強(qiáng)類型和基于類的面向?qū)ο缶幊?。類類型接口示例接口更注重功能的設(shè)計,抽象類更注重結(jié)構(gòu)內(nèi)容的體現(xiàn)模塊中引入了模塊的概念,在中也支持模塊的使用。 一:Typescript簡介 維基百科: TypeScript是一種由微軟開發(fā)的自由和開源的編程語言。它是JavaScript的一個嚴(yán)格超集,并添加了可選的靜態(tài)類型和基于類的面向?qū)ο缶幊?。C#的首席架構(gòu)師以及Delp...
摘要:二面向?qū)ο笥惺裁刺卣髅嫦驅(qū)ο蟮闹饕卣饔谐橄罄^承封裝和多態(tài)。析構(gòu)函數(shù)析構(gòu)函數(shù)是在引入的,它的作用與調(diào)用時機(jī)和構(gòu)造函數(shù)剛好相反,它在對象被銷毀時自動執(zhí)行。 PHP面試專欄正式起更,每周一、三、五更新,提供最好最優(yōu)質(zhì)的PHP面試內(nèi)容。PHP中面向?qū)ο蟪?嫉闹R點有以下7點,我將會從以下幾點進(jìn)行詳細(xì)介紹說明,幫助你更好的應(yīng)對PHP面試常考的面向?qū)ο笙嚓P(guān)的知識點和考題。整個面向?qū)ο笪恼碌慕Y(jié)構(gòu)涉...
摘要:由于靜態(tài)方法不需要通過對象即可調(diào)用,所以偽變量在靜態(tài)方法中不可用。繼承一個抽象類的時候,子類必須定義父類中的所有抽象方法另外,這些方法的訪問控制必須和父類中一樣。 extends對象繼承 PHP中類不允許同時繼承多個父類,也就是extends后面只能跟一個父類名稱,這個特性被稱為PHP的單繼承特性 當(dāng)擴(kuò)展一個類,子類就會繼承父類所有公有的和受保護(hù)的方法。除非子類覆蓋了父類的方法,被...
摘要:核心技術(shù)卷第章對象與類面向?qū)ο蟪绦蛟O(shè)計創(chuàng)建標(biāo)準(zhǔn)類庫中的類對象如何編寫自己的類傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計首先確定如何操作數(shù)據(jù),再決定如何組織數(shù)據(jù)。當(dāng)使用構(gòu)造器時,無法改變所構(gòu)造的對象類型。 《Java核心技術(shù) 卷Ⅰ》 第4章 對象與類 面向?qū)ο蟪绦蛟O(shè)計 創(chuàng)建標(biāo)準(zhǔn)Java類庫中的類對象 如何編寫自己的類 OOP 傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計:首先確定如何操作數(shù)據(jù),再決定如何組織數(shù)據(jù)。 面向?qū)ο蟪绦蛟O(shè)...
摘要:可以使用關(guān)鍵字來定義類的靜態(tài)屬性,示例代碼如下輸出輸出抽象類有抽象類的概念,他是供其他類繼承的基類,不能直接實例化。抽象類必須包含一些抽象方法,同時也可以包含非抽象的成員。 學(xué)習(xí)Angular 2 , 《揭秘Angular 2》讀書筆記。Angular2 選擇 TypeScript 作為其官方最主要的構(gòu)建語音,這意味著掌握 TypeScript 語音將更有利于高效地開發(fā) Angular...
閱讀 1876·2021-11-25 09:43
閱讀 3705·2021-11-24 10:32
閱讀 1099·2021-10-13 09:39
閱讀 2347·2021-09-10 11:24
閱讀 3363·2021-07-25 21:37
閱讀 3481·2019-08-30 15:56
閱讀 876·2019-08-30 15:44
閱讀 1466·2019-08-30 13:18