使用单例模式在整个应用程序中维护数组的状态

时间:2012-01-12 07:16:04

标签: javascript

function MySingletonClass(arg) {
  this.arr = [];    
  if ( arguments.callee._singletonInstance )
    return arguments.callee._singletonInstance;
  arguments.callee._singletonInstance = this;    
  this.Foo = function() {
      this.arr.push(arg);
    // ...
  }
}

var a = new MySingletonClass()
var b = MySingletonClass()
Print( a === b ); // prints: true

我的要求是我在每个窗口加载时将对象推送到一个数组,但是当我打开下一个窗口时,数组的状态是不可见的。

var arr = [];
arr.push("something");

//它被推了。

当我打开新窗口时,数组的长度再次变为零。

2 个答案:

答案 0 :(得分:3)

单独使用JavaScript无法做到这一点。 JavaScript 只是语言。它没有任何直接链接到应用程序,页面甚至浏览器。 JavaScript可以在许多其他情况下使用(并在其中使用),例如在服务器端应用程序中以及作为桌面应用程序的插件语言。

当然,当在浏览器中使用JavaScript时,您确实需要一种与页面上的内容“通信”的方式。为此,您可以使用Document Object Model(DOM)API,该API由支持JavaScript的每个浏览器实现。要与浏览器本身通信,您可以使用window和其他全局对象。这些有时被称为浏览器对象模型(虽然它不是官方API)。

现在我们知道了;是否有一个API,允许我们维护页面之间的状态?就在这里。事实上,有几个:

localStorage

为例
// On page 1:
localStorage.setItem("message", "Hello World!");
// On page 2:
var message = localStorage.getItem("message");
if (message !== null) {
    alert(message);
}

简单,对吗?不幸的是,localStorage只接受键/值对。要保存数组,首先需要将其转换为字符串。你可以这样做,例如,使用JSON:

// On both pages:
var arr = localStorage.getItem("arr");
if (arr === null) {
    arr = [];
} else {
    arr = JSON.parse(arr);
}

function saveArr() {
    localStorage.setItem("arr", JSON.stringify(arr));
}
// On page 1:
console.log(arr); // []
arr.push("Hello");
arr.push("world!");
saveArr();
// On page 2:
console.log(arr); // ["Hello", "world!"]

请注意,localStorageJSON都是相当新的,所以只有现代浏览器才支持它们。请查看emulating localStorage using cookiesJSON2.js

答案 1 :(得分:1)

要在应用程序中保留数据,必须有数据库。 Javascript无法实现这一点,因为它只是客户端,主要用于呈现用户界面。