摘要:熟悉面向對象編程的都知道,面向對象編程最重要的原則之一從外部接口劃分內部接口。所以,面向對象編程就類似于汽車一樣。
熟悉面向對象編程的都知道,面向對象編程最重要的原則之一 - 從外部接口劃分內部接口。也就是說,針對某一類事物,我們其實并不是那么在乎其內部究竟是怎樣去實現的,只關心怎樣使用而已。
為了理解這點,讓我們先來看看現實生活中的列子。通常,我們使用的設備非常復雜。但是從外部接口界定內部接口允許使用它們沒有什么問題。列如一輛汽車。從外面看主要有:輪子、車身、車頂、方向盤等。
但是,內部...
有許多的細節,但是我們并不用去知道這些細節,也可以很好地開車車。
汽車非常可靠,不是嗎?我們可以使用很多年,只有在出現問題時才能使用它 - 進行維修。汽車的可靠性和使用的簡單性在于隱藏內部細節。
如果我們從汽車上取下發動機,那么使用它將會復雜得多(安裝在哪?),并且危險(它可以電擊)。
所以,面向對象編程就類似于汽車一樣。
內部和外部接口在面向對象的編程中,屬性和方法可以分為兩組:
內部接口-方法和屬性,可以從類的其他方法訪問,但不能從外部訪問
外部接口-方法和屬性,也可以從外部訪問
如果我們繼續與汽車進行類比 - 內部隱藏的部分:發動機、變速器、半軸等 - 是其內部接口。對于對象的運行,內部接口是非常有用的,其細節互相使用。例如,彈性元件連接到減震器。
但是從外面看,汽車被外層車殼保護著,所以沒有人可以接觸到。細節隱藏且無法訪問。我們可以通過外部接口使用它的功能。所以,我們在使用一個對象的時候,并不關心它內部是怎樣工作的。
在JavaScript中,有兩種類型的對象字段(屬性和方法):
公共的:隨處都可訪問,它們包含外部接口,我們在開發中一直常用的也就是公共的屬性和方法了
私有的:僅在類的內部可訪問,主要用于內部接口
在許多其他語言中,還存在“受保護”字段:只能從類內部訪問和擴展它們。它們對內部接口也很有用。它們在某種意義上比私有更廣泛,因為我們通常希望通過繼承類來獲取和訪問它們。
受保護的字段不是在JavaScript語言級別上實現的,但實際上它們非常方便,我們也可以模擬地去實現它們。現在我們用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這兩個屬性是公共的,我們可以在外部輕易地設置以及獲取它們。
讓我們將oilAmount屬性更改為protected以對其進行更多控制。例如,我們不希望任何人將其設置為零以下。
受保護的屬性通常以下劃線_為前綴這不是在語言層面強制去執行,但咱們程序員之間有一個眾所周知的慣例,即不應該從外部訪問這些屬性和方法。
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
現在訪問受到控制,因此將油量設置為零以下將失敗。
那么我們可以把power屬性設置為只讀屬性,這在一些程序開發中也有類似的需要,某些屬性只讀不可更改其值。
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());
受保護的屬性是可以繼承的
如果我們繼承類MBWCar擴展Car,那么沒有什么能阻止我們從新類的方法中訪問this._oilMount 或this._power屬性。 所以受保護的屬性是可以繼承的,不像接下來我們所說的私有屬性。私有字段
這是JavaScript后面新增的一個針對類屬性的語法。JavaScript引擎不支持,或者部分支持,需要進行polyfilling
在JavaScript的提議中,有一個已完成的標準,為私有屬性和方法提供語言級支持。
私有的私有字段與#開頭,僅在類的內部可進行訪問.
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()
總結:
面向對象編程最重要的原則之一 - 從外部接口劃分內部接口,這就涉及到屬性和方法的可訪問范圍度
在面向對象編程中,可通過private、protected、public來對類的屬性和方法進行限制,例如你從你父親那里繼承了一些屬性,但你父親其他屬性不像被你繼承到等。
在JavaScript中,受保護的屬性和方法名以_開頭,私有的屬性和方法名以#開頭
面向對象編程的一個較大的好處之一是我們不必理解其內部實現,依然可以很好地去進行編程開發,例如:一個U盤,我們想要將電腦中的某些文件拷貝到它那里進行存儲,這時候我們并不關心U盤的內部是這樣形成的,我們只知道通過USB口插入即可完成拷貝的工作
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/105751.html
摘要:添加了可選的靜態類型注意并不是強類型和基于類的面向對象編程。類類型接口示例接口更注重功能的設計,抽象類更注重結構內容的體現模塊中引入了模塊的概念,在中也支持模塊的使用。 一:Typescript簡介 維基百科: TypeScript是一種由微軟開發的自由和開源的編程語言。它是JavaScript的一個嚴格超集,并添加了可選的靜態類型和基于類的面向對象編程。C#的首席架構師以及Delp...
摘要:二面向對象有什么特征面向對象的主要特征有抽象繼承封裝和多態。析構函數析構函數是在引入的,它的作用與調用時機和構造函數剛好相反,它在對象被銷毀時自動執行。 PHP面試專欄正式起更,每周一、三、五更新,提供最好最優質的PHP面試內容。PHP中面向對象常考的知識點有以下7點,我將會從以下幾點進行詳細介紹說明,幫助你更好的應對PHP面試常考的面向對象相關的知識點和考題。整個面向對象文章的結構涉...
摘要:由于靜態方法不需要通過對象即可調用,所以偽變量在靜態方法中不可用。繼承一個抽象類的時候,子類必須定義父類中的所有抽象方法另外,這些方法的訪問控制必須和父類中一樣。 extends對象繼承 PHP中類不允許同時繼承多個父類,也就是extends后面只能跟一個父類名稱,這個特性被稱為PHP的單繼承特性 當擴展一個類,子類就會繼承父類所有公有的和受保護的方法。除非子類覆蓋了父類的方法,被...
摘要:核心技術卷第章對象與類面向對象程序設計創建標準類庫中的類對象如何編寫自己的類傳統的結構化程序設計首先確定如何操作數據,再決定如何組織數據。當使用構造器時,無法改變所構造的對象類型。 《Java核心技術 卷Ⅰ》 第4章 對象與類 面向對象程序設計 創建標準Java類庫中的類對象 如何編寫自己的類 OOP 傳統的結構化程序設計:首先確定如何操作數據,再決定如何組織數據。 面向對象程序設...
摘要:可以使用關鍵字來定義類的靜態屬性,示例代碼如下輸出輸出抽象類有抽象類的概念,他是供其他類繼承的基類,不能直接實例化。抽象類必須包含一些抽象方法,同時也可以包含非抽象的成員。 學習Angular 2 , 《揭秘Angular 2》讀書筆記。Angular2 選擇 TypeScript 作為其官方最主要的構建語音,這意味著掌握 TypeScript 語音將更有利于高效地開發 Angular...
閱讀 1846·2021-11-25 09:43
閱讀 3688·2021-11-24 10:32
閱讀 1076·2021-10-13 09:39
閱讀 2328·2021-09-10 11:24
閱讀 3344·2021-07-25 21:37
閱讀 3464·2019-08-30 15:56
閱讀 858·2019-08-30 15:44
閱讀 1448·2019-08-30 13:18