本文實例講述了javascript面向對象三大特征之封裝。分享給大家供大家參考,具體如下:
封裝
封裝(Encapsulation):就是把對象內部數據和操作細節進行隱藏。很多面向對象語言都支持封裝特性,提供關鍵字如private來隱藏某些屬性和方法。要想訪問被封裝對象中的數據,只能使用對象專門提供的對外接口,這個接口一般為方法。調用該方法能夠獲取對象內部數據。
在JavaScript語言中沒有提供專門的信息封裝關鍵字,不過可以使用閉包來創建,只允許從對象內部訪問的方法和屬性。另外,接口也是數據封裝的一種工具,接口提供了外界訪問方法的約定。在應用開發中,所有類都應定義接口,類只向外提供已實現接口中規定的方法,任何別的方法都是隱藏的。其所有屬性都是私有的,外界只能通過接口中定義的存取操作與之打交道。
---引自 《jQuery開發從入門到精通》,不過原書有錯誤,或者可能是我錯買了盜版,不過下面代碼都是經過我修改的,沒有問題。
被動封裝
被動封裝:就是對對象內部數據進行適當約定,這種約定具有很強的主觀性,沒有強制性保證,主要針對公共對象而言。一般來說,JavaScript所包含的數據都是公開的,沒有隱私可言,其中的信息可以隨意被訪問。下面給出一個例子來闡述:
var Person = function (name,gender) { if(name === undefined) { throw new Error("name is necessary") } else { this.name = name; } if(gender === undefined) { throw new Error("gender is necessary") } else { this.gender = gender; }}var p = new Person("Tom",1); // 如果我們實例化的時候,如果傳遞參數錯誤了,將會報異常為了數據安全,代碼中適當的增加了一些條件限制,避免非法信息侵入。
var Animal = function (species) { if(!this.checkSpecies(species)) { throw new Error('species is illegal'); } else { this.species = species; }}Animal.prototype = { checkSpecies:function(species){ // 檢測 species , 參數為 species , 合法返回true ,這里可自定義檢測邏輯 // 這里先讓它直接返回 true return true; }}var ani = new Animal("dog");從更安全和擴展的角度來說,凡是類都應該定義接口,這樣能夠保證數據存取更加安全,同時也方便團隊的合作。內部私有方法檢測和接口措施可在一定程度上保護對象內部數據,但是他們也存在一個致命漏洞(這些屬性和方法可以被公開重置,面對公開覆蓋屬性和方法值,任何人都無法阻止這種行為。),比如這樣的:
var Util = function() {};Util.prototype = { _say:function(){ console.log("這里有一個私有的成員 _say方法"); }}// 下面我們來修改它Util.prototype._say = function(){ console.log('哈哈,我已經被修改了');}// 開始檢測var util = new Util;util._say(); // 哈哈,我已經被修改了
新聞熱點
疑難解答
圖片精選