首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单例模式javascript

单例模式javascript
EN

Stack Overflow用户
提问于 2013-02-14 19:50:04
回答 2查看 474关注 0票数 3

我是javascript的新手,我发现我不知道一种适当的方法来反复获取相同变量的实例。我用下面的代码打开一个Xml文件:

代码语言:javascript
复制
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文件)?

谢谢!!

EN

回答 2

Stack Overflow用户

发布于 2013-02-14 19:53:53

代码语言:javascript
复制
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。

票数 5
EN

Stack Overflow用户

发布于 2013-02-14 20:00:38

我建议您使用JavaScript中的函数闭包来实现这一点:

代码语言:javascript
复制
function createSingleton(fn) {
  var singleton = fn.apply(this);
  return function () {
    return singleton;
  };
}

这是一个泛型函数,它从任何其他返回某些内容的函数中创建一个单例。它的结果将被存储在函数闭包中,并且您可以执行所得到的函数任意次数,以获得单例。如果您担心传递该函数,您可以将其存储在全局对象中:

代码语言:javascript
复制
var xml = createSingleton(getXML);

console.log(xml()); //use the xml object
console.log(xml() === xml());

这里实际发生的情况是,createSingleton在执行时执行底层工厂方法一次,存储其结果,并返回一个仅返回该结果的函数。你甚至可以用下面的代码来做延迟加载:

代码语言:javascript
复制
function createSingletonLayz(fn) {
  var singleton = null,
      context = this;
  return function () {
    if (!singleton) {
       singleton = fn.apply(context)
    }
    return singleton;
  };
}

PS:不要担心多线程和通常的lock的事情,以使单例代码线程安全。JavaScript只在一个循环中执行代码(这就是为什么我们到处都有回调的原因)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14874193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档