淺談js單例模式


單例模式就是在系統中保存一個實例,就是一個全局變量,在團隊開發中,為了實現一些相似的功能,比如不同頁面之間的表單驗證,可能需求是不一樣的,但是呢命名可能一樣,這時就會產生沖突,這時候單例模式就能很好的解決這個問題。

首先說說它的優點:

1,單例模式聲明一個命名空間,它生成一個唯一的全局變量,一個命名空間,可以用聲明對象的方式來聲明:

var mapleTao={ name:"mapleTao",init:function(){console.log(this.name)}};

有木有發現這個和對象有點類似呢,其實name,init是它的屬性,通過mapleTao.name就獲取它name的值,通過mapleTao.init()就可以調用init方法,這樣在哎處理多需求頁面,多人開發時就能很好的解決命名沖突的問題,以及可以更好的維護代碼,更好的控制代碼。

2,單例模式在全局中只聲明一個變量,大家都知道在js中,假設你寫了一個方法,如 function aa(){},這樣就會在window中生成一個叫aa的變量,當實現一個功能時,在代碼封裝中,會創建好多函數,好多function,這樣就會在window中創建好多變量,會占用更多的內存單元,全局變量的作用域很廣,在眾多處理函數中都可能改變,這樣當出現bug時不容易快速找到,而通過單例模式創建的對象變量中可以更快速的找到問題,從而解決,這大大減少的問題修復的時間以及系統加載的時間。

3.在實現同一個功能的地方比通過new新創建對象對內存對資源的占用更據優勢。

上述是它的一些優點,當然既然有優點缺點也是必不可少的。

1,它的擴展性不好,對一個單例對象里面的方法重寫時會破壞原有的需求,就如上述中的init,如果你寫下如下代碼 mapleTao.init=function(){console.log(1)};那么init方法就會把原有的方法替換,從而改變了該方法的實現,會破壞它的功能。

2,靈活性不好, 當某個需要實現該功能的需求需要變動時,而其他的又不需要變動時,單例對象就不好處理了。

3,在js中對象的存儲有一個較大的問題,對象是存儲在內存中的一塊中,一個對象在內存中可能是一串2b4c6rr,一串地址,如下代碼,

var a={name:"maple"};

var b=a;

console.log(a.name); //maple

b.name="mapleTao";

console.log(a.name);//mapleTao

從這就可以改變b是等於a的,它們的存儲地址一樣,當改變b中的屬性值時,你在去訪問a時,它也會去找這個地址,雖然並沒有對a這個對象進行操作,但地址里面的東西改變了,從而你去訪問時也就被動的改變了,這個在項目中經常會出現問題。這就說明當一個單例對象創建完成時,他是不能隨意改的。這也是它的局限性。

綜合上述,單例模式是一把雙刃劍,它既有好處也有壞處,如果使用,則要取決於需求。

以上純屬個人觀點,如有更好的建議,歡迎灌水。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM