????????今天是2018/07/02, 今天繼續(xù)帶大家走進(jìn) js 底層的設(shè)計(jì)模式 , 作為一個(gè)web工程師,我想次面試,都
會問道? html 蝇更、js 、css 宛逗、這些基本的知識點(diǎn),很少問到他的設(shè)計(jì)模式,
1. 單例模式
????????單例模式的定義是:保證一個(gè)類僅有一個(gè)實(shí)例坎匿,并提供一個(gè)訪問它的全局訪問點(diǎn)。
????????單例模式是接近傳統(tǒng)面向?qū)ο笳Z言中的實(shí)現(xiàn),要實(shí)現(xiàn)一個(gè)標(biāo)準(zhǔn)的單例模式并不復(fù)雜替蔬,無非是用一個(gè)變量
來標(biāo)志當(dāng)前是否已經(jīng)為某個(gè)類創(chuàng)建過對象告私,如果是,則在下一次獲取該類的實(shí)例時(shí)承桥,直接返回之前創(chuàng)建的對象
單例對象從“類”中創(chuàng)建而來驻粟。在以類為中心的語言中,這是很自然的做法凶异。但是JavaScript 其實(shí)是一門動態(tài)類型蜀撑、
弱類型、基于原型的語言剩彬,javascript 是沒有 類? 和 接口 定義的.
示例如下:
var Singleton = function( name ){
????????this.name = name;
????????this.instance = null;
};
Singleton.prototype.getName = function(){
????????alert ( this.name );
};
Singleton.getInstance = function( name ){
????????if ( !this.instance ){
????????this.instance = new Singleton( name );
????}
????return this.instance;
};
var a = Singleton.getInstance( 'sven1' );
var b = Singleton.getInstance( 'sven2' );
alert ( a === b ); // true
或者是
var Singleton = function( name ){
? ? this.name = name;
};
Singleton.prototype.getName = function(){
????????alert ( this.name );
};
Singleton.getInstance = (function(){var instance = null;
return function( name ){
????if ( !instance ){
????????instance = new Singleton( name );
????}
return instance;
}
})();
這種方式相對比較簡單.
在 JavaScript 開發(fā)中酷麦,我們經(jīng)常會把全局變量當(dāng)成單例來使用。例如:
?var a = {};
但是 全局變量 不是單例模式;當(dāng)用這種方式創(chuàng)建對象 a 時(shí)喉恋,對象 a 確實(shí)是獨(dú)一無二的沃饶。如果 a 變量被聲明在
全局作用域下,則我們可以在代碼中的任何位置使用這個(gè)變量轻黑,全局變量提供給全局訪問是理所當(dāng)然的糊肤。
但是全局變量存在很多問題,它很容易造成命名空間污染氓鄙。在大中型項(xiàng)目中馆揉,如果不加以限制和管理,
程序中可能存在很多這樣的變量玖详。JavaScript 中的變量也很容易被不小心覆蓋把介,相信每個(gè) JavaScript 程序員
都曾經(jīng)歷過變量沖突的痛苦,就像上面的對象 var a = {};蟋座,隨時(shí)有可能被別人覆蓋拗踢。解決方案如下
1. 使用命名空間適當(dāng)?shù)厥褂妹臻g,并不會杜絕全局變量向臀,但可以減少全局變量的數(shù)量巢墅。
最簡單的方法依然是用對象字面量的方式:
var namespace1 = {
????????a: function(){
????????????alert (1);????????
? ? ? ? },
? ? ? ? b: function(){
????????????alert (2);
????????}
};
2. 使用閉包封裝私有變量
var user = (function(){
????var __name = 'sven',//私有變量
????????__age = 29;//私有變量
return {
????????getUserInfo: function(){
????????return __name + '-' + __age;
????????}
}
})();
單例模式是一種簡單但非常實(shí)用的模式,在合適的時(shí)候才創(chuàng)建對象券膀,并且只創(chuàng)建唯一的一個(gè)君纫。
點(diǎn)擊查看下一篇?: 策略模式和迭代器模式.