簡體   English   中英

單身模式javascript

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM