《JavaScript設計模式》章3--封裝和資訊隱藏
阿新 • • 發佈:2021-06-24
前面兩章感覺有點囫圇吞zao...
封裝
在java中通常使用關鍵字
private
來實現資訊的隱藏,表明只有類的內部才能進行呼叫和訪問
在js中沒有private關鍵字,我們是使用閉包
來建立只允許物件內容訪問的屬性和方法
建立物件的基本模式
同樣的,每中模式都各有利弊,我們不能武斷說哪種模式好或者壞
- 門戶大開型
使用一個函式來做構造器,所有的方法和屬性都是公開的
- 用命名規範來區分公/私有成員--使用下劃線來表示方法和屬性的私有性
和第一種如出一轍,但以下劃線開頭以示其私有性
- 閉包
先舉個小例子
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
可以宣告常量嘿嘿
封裝之利
- 保護了內部資料的完整性
- 通過將資料的訪問途徑限制為
取值器
和複製器
這兩個方法,可以獲得對取值賦值的完全控制 - 可以減少其他函式所需的錯誤檢查程式碼的數量,並確保資料不會處於無效狀態
- 物件的重構也因此變得輕鬆,因為使用者不知道物件的內部細節,你可以隨心所欲的修改
封裝之弊
- 私有化的方法很難進行單元測試
- 使用閉包會和複雜的作用域鏈打交道,使得錯誤除錯更加困難
- 容易過度封裝
- 對新手不友好