在沒有對象和函數等引用數據類型的時候,咱們只能基於建立變量的方式來描述某一件事務,某一個個體的相關信息javascript
var name="張三";
var age=25;
var height="180cm";
var name="李四";
var age=28;
var height="175cm";
......
複製代碼
這樣會大量建立全局變量,最後致使全局變量的衝突(全局變量污染)java
需求:咱們指望可以把描述一個事務的相關信息可以分組(或分類)來管理;編程
- 此時對象數據類型就起到了很大的做用
var person1={
name:'張三',
age:25,
...
};
var person2={
name:'李四',
age:28,
...
};
複製代碼
- 分組以後,每一組中的鍵值對都是私有的,即便兩組之間有相同名字的屬性,也不會衝突,大大解決了全局變量污染的問題
- => 「這種分組管理的概念,就是JS中最先的單例設計模式思想」
var obj = { xxx:xxx , ...}
;obj
不只僅是一個變量存儲對象(對象名),也被成爲「命名空間」(其實就是給對象的堆內存設置一個obj
的名字,堆內存是空間,obj
是名字);在其它的編程語言中,認爲只有基於構造函數構造出來的實例才能被稱爲「單例設計模式」,也就是
var xxx = new xxx
;設計模式可是在
JS
中,var obj={...}
; 自己就是基於new Object()
構建出來的,因此是標準的單例設計模式;閉包
真實項目開發中,尤爲是團隊協做開發,咱們常常會把一個大的頁面,按照功能特色進行「版塊/模塊」劃分,這樣一個版塊中須要編寫不少屬性和方法來實現具體的功能;編程語言
此時,有些方法只須要版塊內部使用,而有些方法可能再其餘版塊中也須要使用,這樣咱們既要私有化,也要暴露一些方法供面調取,這裏就涉及到咱們的模塊管理思想;模塊化
單例設計模式也是最基礎的模塊化思想函數
基於單例設計模式思想 + 閉包思想 + 模塊管理思想ui
var utils=(function(){
function queryElement(){}
function deleteElement(){}
...
//=>導出當前版塊中須要供別人調取的屬性方法(也至關於把這些屬性方法放到utils命名空間下進行分組管理,避免和別人的衝突)
return {
queryElement:queryElement,
deleteElement:deleteElement
};
})();
var searchModule=(function(){
function queryData(){}
function bindHTML(){
//=>須要調取utils模塊(命名空間中的方法)
utils.queryElement();
}
return {
init:function(){
}
};
})();
複製代碼
基於「單例設計模式」記錄人員信息(舉例):建立單獨的實例或者命名空間,把描述每一個人的信息分組管理便可實現spa
var person1={
name:'小明',
age:92,
sex:'男',
score:90
};
var person2={
name:'小剛',
age:62,
sex:'男',
score:85
};
var person3={
name:'小紅',
age:18,
sex:'女',
score:100,
qunzi:'red'
};
複製代碼
function createPerson(name,age,sex,score,qunzi){
var person={};
person.name=name;
person.age=age;
person.sex=sex;
person.score=score;
if(typeof qunzi!=="undefined"){
//=>傳遞了qunzi 形參對應的實參值
person.qunzi=qunzi;
}
return person;
}
var person1=createPerson('小明',92,'男',90);
var person2=createPerson('小剛',62,'男',85);
var person3=createPerson('小紅',18,'女',100,'red');
複製代碼