Singleton pattern 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中,然后导航到其他html,而不会丢失该变量值(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;
};
}
这是一个通用函数,它从任何其他返回内容的函数中创建一个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只在一个循环中执行代码(这就是为什么我们到处都有回调)
相关文章:
- Javascript regexObj.exec()表示TypeError:pattern.exec不是函数
- Javascript and singleton pattern
- $(this) in JavaScript Module Pattern
- Java SimpleDateFormat Pattern for JavaScript Date
- JavaScript / jQuery input[type=text] pattern
- Javascript Chessboard Pattern,onclick 函数帮助(基本)
- Javascript Module Pattern有什么好处
- 从javascript构建angularjs的ng-pattern
- JavaScript undefined-safety-pattern 是否同样好
- Javascript Module Pattern 和 new 关键字
- JavaScript REGEX 使用自定义函数扩展 '/pattern/'
- Javascript Regex Pattern "{{text}}"
- Reg Exp for Javascript pattern MM / YYYY
- Javascript pattern: ( function(){} (function(){}) )
- Javascript新RegExp vs. /pattern/和多行
- javascript: html5-pattern regex question
- SVG & lt; pattern>won't在Javascript生成时加载
- JavaScript library pattern
- javascript module pattern from You don't know JS
- Singleton pattern javascript