《JavaScript設計模式》章5--單體模式
阿新 • • 發佈:2021-07-05
單體的基本結構
好氣,之前寫了好久的東西由於公司停電全沒了,這篇全部是重寫的。。。就當溫故知新了吧...
var Singleton = {
attribute1: true,
attribute2: 10,
method1: function() {...},
method2: function(arg) {...}
}
劃分名稱空間
var nameSpace = { findProduct: function() {...} } //這裡的findProduct不會覆蓋前面的,因為前面的是通過nameSpace.findProduct()進行訪問 var findProduct = 1
擁有私有成員的單體
使用下劃線表示私有
這種形式的私有性完全靠自覺
var mySingle = {
//公有成員
attribute_one: 1,
//私有成員,下劃線開頭
_attribute_two: true
}
使用閉包實現私有
基本思路就是使用立即執行函式來返回一個物件字面量
var mySingle = (function() { //這裡定義的成員是私有的 var attribute_me = false //方法也可以私有 function_me: function() {...} return { //公共成員可以在這裡暴露出去 attribute_pub: 1, //可以暴露出操作私有成員的公共方法例如setName, getName等 ... } })()
惰性例項化單體
思路:把前面立即執行的函式中的邏輯封裝成一個建構函式,然後返回一個公用的例項化方法來呼叫建構函式
//這裡使用dx來代表“惰性”...
var mySingle_dx = (function() {
constructor: functionn() {
//之前的程式碼,就是相當於把直接的return轉換成呼叫constructor()才返回
...
}
//將例項化的方法暴露出去
return {
getInstance: function() {
return constructor()
}
}
})()
真正的體現“單體”
我們在前面程式碼的基礎上需要做到: 未例項化返回新例項,否則返回已有例項
//這裡使用dx來代表“惰性”...
var mySingle_dx = (function() {
constructor: functionn() {
//之前的程式碼,就是相當於把直接的return轉換成呼叫constructor()才返回
...
}
//在這裡新增一個私有屬性來標記是否已經被例項化
var uniqueInstance;
//將例項化的方法暴露出去
return {
getInstance: function() {
//根絕例項化的情況作出不同的處理
if(!uniqueInstance) {
uniqueInstance = constructor()
}
return uniqueInstance;
}
}
})()
分支
思路: 在我們前面之間返回一個物件的思路基礎上,根據業務條件宣告好多個(類似的)物件字面量,但最終只返回其中滿足條件的一個
var mySingle_branch = (function() {
var objA = {
//定義屬性和方法
}
var objB = {
//定義屬性和方法
}
return (someConditions) ? objA : objB
})()