添加到localStorage对象(链接)

时间:2010-07-05 22:33:20

标签: javascript html5 local-storage

  

可能重复:
  Chaining a function in JavaScript?

我问过一个similar question,但是很多人都很困惑,很多评论都没有意义(就像有人评论 jQuery重载...... 而且这无关用jQuery)。

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

一样使用
localStorage.getItem('names').addItem('Bill').getItem('names');

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

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

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

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

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

2 个答案:

答案 0 :(得分:4)

Anurag的建议听起来像是最好的解决方法(Mozilla Hacks demonstrates the other option he outlines),但为了更进一步,让它可以链接,你可以做类似的事情:

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()
);
BTW:几乎不可能在LocalStorage对象上找到官方文档(例如在MDC或任何其他在线JS文档库中)。

答案 1 :(得分: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));
};