標(biāo)簽:JS 設(shè)計(jì)模式
- 《JS設(shè)計(jì)模式》讀書筆記(二)
- 《JS設(shè)計(jì)模式》讀書筆記(三)
- 《JS設(shè)計(jì)模式》讀書筆記(四)
- 《JS設(shè)計(jì)模式》讀書筆記(五)
- 《JS設(shè)計(jì)模式》讀書筆記(六)
- 《JS設(shè)計(jì)模式》讀書筆記(七-完結(jié))
前言
該書全名《JavaScript設(shè)計(jì)模式與開發(fā)實(shí)踐》莉给,作者是AlloyTeam的曾探。作者從JS的角度來描述設(shè)計(jì)模式兔跌,并且結(jié)合了作者的工作實(shí)踐朦拖,使得本書非常有參考價(jià)值,推薦閱讀禁添。
本文就是記錄閱讀過程中的一些個(gè)人理解熟丸,以及摘抄書中的代碼來加深記憶刺洒,也推薦大家敲一遍代碼豫尽,會(huì)有更多的想法與理解篙梢。另外,設(shè)計(jì)模式涉及到很多面向?qū)ο蟮闹R(shí)美旧,因此讀者需要掌握一定的JS基礎(chǔ)渤滞,例如要懂得閉包贬墩,高階函數(shù)之類的。好妄呕,廢話不多說陶舞,開始正文。
單例模式
用于創(chuàng)建全局可用绪励,全局唯一的對(duì)象
有以下幾種實(shí)現(xiàn)方法吊说,各有優(yōu)缺點(diǎn)
1.使用自身方法
// 使用自身方法來實(shí)現(xiàn)單例
var Singleton = function(name) {
this.instance = null;
this.name = name;
}
Singleton.prototype.getName = function() {return this.name}
Singleton.prototype.getInstance = function(name) {
if(!this.instance) {
this.instance = new Singleton(name);
}
return this.instance;
}
var a = Singleton.getInstance('chen');
var b = Singleton.getInstance('zhe');
console.log(a === b) // true
這種方法的缺點(diǎn)是一定要使用 Singleton.getInstance()
來獲取單例,而不能使用 new
2.閉包
var Singleton = (function(){
var instance = null;
function single(name) {
if(!instance) {
instance = this;
}
return instance;
}
single.prototype = {} // 定義方法
return single
})()
var a = new Singleton('chen');
var b = new Singleton('zhe');
console.log(a === b) // true
缺點(diǎn)是使用了閉包优炬,比較麻煩,并且single類定義在閉包里面不能像普通類一樣使用
3.單例代理類
var Action = function(name) {
this.name = name
}
Action.prototype = function doSomething(){};
var ProxySingletonAction = (function() {
var instance = null;
return function(name) {
if(!instance) instance = new Action(name);
return instance;
}
})
var a = new ProxySingletonAction('chen');
var b = new ProxySingletonAction('zhe');
console.log(a === b) // true
優(yōu)點(diǎn):將類的實(shí)際作用與單例模式的使用分離開來厅贪,提高內(nèi)聚蠢护。
缺點(diǎn):不夠通用,對(duì)于新的類又要重復(fù)寫相同的代碼养涮。
4.更加通用的單例實(shí)現(xiàn)函數(shù)
var getSingle = (function(){
var single
return function(fn){
return single || (single = fn.apply(this, arguments));
}
})()
// 使用
// 無論執(zhí)行多少次createSingleDiv(), 都只返回同一個(gè)div
var createSingleDiv = getSingle(function(){
return document.createElement('div')
})
這種方法本質(zhì)上是緩存函數(shù)結(jié)果葵硕,并且限制函數(shù)只執(zhí)行一次。
這里使用單例主要是針對(duì)那些全局只有一個(gè)就可以的對(duì)象贯吓,多于1個(gè)就浪費(fèi)懈凹。