1. 程式人生 > 其它 >《JavaScript設計模式》章3--封裝和資訊隱藏

《JavaScript設計模式》章3--封裝和資訊隱藏

前面兩章感覺有點囫圇吞zao...

封裝

在java中通常使用關鍵字private來實現資訊的隱藏,表明只有類的內部才能進行呼叫和訪問

在js中沒有private關鍵字,我們是使用閉包來建立只允許物件內容訪問的屬性和方法

建立物件的基本模式

同樣的,每中模式都各有利弊,我們不能武斷說哪種模式好或者壞

  1. 門戶大開型

使用一個函式來做構造器,所有的方法和屬性都是公開的

  1. 用命名規範來區分公/私有成員--使用下劃線來表示方法和屬性的私有性

和第一種如出一轍,但以下劃線開頭以示其私有性

  1. 閉包
    先舉個小例子
  function foo() {
    let a = 1;
    funtion bar() {
      a *= 2;
      return a;
    }
    return bar;
  }
  //上面的foo看做一個類
  let test1 = foo()  
  let test2 = foo()

  //執行測試
  test1() //2
  test1() //4

  test2() //2

前兩個test1執行之後可以發現,foo函式中的a變數已經私有化(只能通過內部的bar函式進行訪問);
而test2執行可以發現,test1和test2相當與類foo的兩個例項,相互之間互不影響(test1和test2中的a互不影響)

這種物件建立模式不利於派生子類,因為派生出的子類不能訪問超類中的任何屬性和方法,因此也被稱為“繼承破壞封裝”

更高階的物件建立模式

靜態方法和屬性

在介紹下面這種物件建立模式之前,先說一下靜態的概念

靜態成員所關聯的是類本身,
換句話說就是,靜態成員實在類的層次上操作,而不是在例項的層次上操作,
也就是說,每個靜態成員只有一份

物件建立嘗試

前面一個小例子中,test2第一次執行的時候輸出2, 也就是說foo中的a不是靜態的,不是獨一份

//這裡將類名大寫,  其實跟之前的foo一樣,只不過這樣規範一些
let Foo = (function() {
	let a = 2
	return function() {
		a *= 2
		return a
	}
})()

//建立例項,  
let test1 = Book
let test2 = Book
let test3 = Book

//執行測試
console.log(test1()) //4
console.log(test1()) //8
console.log(test2()) //16
console.log(test3()) //32

可以看到,我們達到了私有化並且 獨一份的目的。

雖然我也是有點懵,但是就是這麼牛逼

常量

這個我選擇略過,畢竟現在有const可以宣告常量嘿嘿

封裝之利

  1. 保護了內部資料的完整性
  2. 通過將資料的訪問途徑限制為取值器複製器這兩個方法,可以獲得對取值賦值的完全控制
  3. 可以減少其他函式所需的錯誤檢查程式碼的數量,並確保資料不會處於無效狀態
  4. 物件的重構也因此變得輕鬆,因為使用者不知道物件的內部細節,你可以隨心所欲的修改

封裝之弊

  1. 私有化的方法很難進行單元測試
  2. 使用閉包會和複雜的作用域鏈打交道,使得錯誤除錯更加困難
  3. 容易過度封裝
  4. 對新手不友好