[英]Singleton pattern javascript
我是javascript的新手,我發現我不知道一種適當的方法來重復獲取同一個變量的實例。 我用這個打開一個Xml文件:
function testXML(){
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET","../res/data.xml",false);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML;
return xmlDoc;
}
我添加了返回,因此我可以選擇該xml文件並進行一些搜索以加載一些包含數據的列表。 問題是,每次我想拿xml文件讀取一些數據我都會調用這個方法,這不僅會返回xml,還有IF / Else和openfile等等...我想這不是那個合適。
那么我怎樣才能創建一個只返回xml文件的方法,所以我只能打開一次? 此外,打開xml文件並將其加載到變量中是安全的,比如在index.html中,然后導航到其他htmls而不會丟失該變量值(xml文件)?
謝謝!!
var xml;
function testXML(){
if(!xml){
if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
} else {// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET","../res/data.xml",false);
xmlhttp.send();
xml = xmlhttp.responseXML;
}
// return xml; // You can optionally also return the xml, but it'd be assigned to the variable already, any way.
}
調用該函數一次,您只需使用xml
變量即可。
或者,如下所示,只需使用testXML()
而不是代碼中的變量,並取消注釋返回。
這可以確保您不會遇到未定義的xml。
我建議你使用JavaScript中的函數閉包來實現這個目的:
function createSingleton(fn) {
var singleton = fn.apply(this);
return function () {
return singleton;
};
}
這是一個泛型函數,它從任何返回某些東西的函數創建一個單例。 它的結果將存儲在函數閉包中,您可以多次執行生成的函數來獲取單例。 如果您擔心傳遞該函數,可以將其存儲在全局對象中:
var xml = createSingleton(getXML);
console.log(xml()); //use the xml object
console.log(xml() === xml());
這里實際發生的是createSingleton在執行時執行一次底層工廠方法,存儲它的結果並返回一個只返回該結果的函數。 你甚至可以用這個延遲加載:
function createSingletonLayz(fn) {
var singleton = null,
context = this;
return function () {
if (!singleton) {
singleton = fn.apply(context)
}
return singleton;
};
}
PS:不要擔心多線程與通常的lock
事物,使單例代碼線程安全。 JavaScript只在一個循環中執行代碼(這就是為什么我們在整個地方都有回調)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.