3

可能重复:
在 JavaScript 中链接函数?

我问了一个类似的问题,但是很多人感到困惑,并且很多评论毫无意义(就像有人评论jQuery 重载......这与 jQuery 无关)。

所以这是我的问题,如何添加到 HTML5 localStorage 对象并创建一个名为 addItem() 的自定义函数?它可以像这样使用:

localStorage.getItem('names').addItem('Bill').getItem('names');

或者

localStorage.getItem('names').addItem('Bill');

上次人们吓坏了,问我为什么要两次 getItem。第一个 getItem 将获取名称中的项目。名字中总会有一些东西。addItem 将添加到名称,然后,getItem 将再次返回名称,但比尔将在里面。

现在,像第二个例子一样工作对我来说也一样好。getItem 将返回名称,addItem 会将 Bill 添加到名称中,然后返回所有名称,包括 bill。

我可以做 setItem,它是 HTML5 API 的一部分,但这很痛苦:

var names = JSON.parse(localStorage.getItem("names"));
names.push("Bill");
localStorage.setItem("names", JSON.stringify(names));
4

2 回答 2

4

Anurag 的建议听起来是最好的解决方法(Mozilla Hacks演示了他概述的另一个选项),但要更进一步并使其可链接,您可以执行以下操作:

var MyLocalStorage = {};

MyLocalStorage.getItem = function(key) {
    return new MyItem(JSON.parse(localStorage.getItem(key)));
};

MyLocalStorage.setItem = function(key, object) {
    localStorage.setItem(key, JSON.stringify(object));
    return this.getItem(key);
};

function MyItem(object, key) {
    this.item = object;
    this.key = key;
    this.addSubItem = function(subItem) {
        if (typeof this.item.push == 'function') {
            this.item.push(subItem);
            this.save();
            return this;
        }
        return false;
    };
    this.setItem = function(object) {
        this.item = object;
        this.save();
        return this;
    };
    this.save = function() {
        MyLocalStorage.setItem(this.key, this.item);
    };
    this.toString = function() {
        return this.item.toString();
    }
}

然后你可以像这样使用它:

alert(
    MyLocalStorage
        .setItem('names', ['john', 'paul', 'ringo'])
        .addSubItem('george')
        .toString()
);

顺便说一句:几乎不可能找到有关 LocalStorage 对象的官方文档(例如,在 MDC 或任何其他在线 JS 文档库上)。

于 2010-07-06T02:03:39.067 回答
2

Storage API 存储一个键值对,它们都是字符串。所以它们需要以某种方式序列化,然后在检索时反序列化。在您的示例中,您使用 JSON 作为(反)序列化机制。

getItem将始终返回您存储的字符串。在从中获取对象之前,必须对其进行反序列化。您可以修改本机getItem函数并在内部进行(反)序列化,或者localStorage为您编写一个包装器。在重新发布问题之前,请阅读其他答案。这就是其他答案所说的。他们没有说你必须使用 jQuery。编写包装器相当简单。

var MyLocalStorage = {};

MyLocalStorage.getItem = function(key) {
    return JSON.parse(localStorage.getItem(key));
};

MyLocalStorage.setItem = function(key, object) {
    localStorage.setItem(key, JSON.stringify(object));
};
于 2010-07-05T23:14:06.723 回答