3

重複の可能性:
JavaScript で関数をチェーンしますか?

私は同様の質問をしましたが、多くの人が混乱し、意味のないコメントがたくさんありました(誰かがjQueryオーバーロードについてコメントしたように...そしてこれはjQueryとは何の関係もありません)。

HTML5 localStorage オブジェクトに追加して、addItem() というカスタム関数を作成するにはどうすればよいですか? 次のように使用できます。

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

また

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

前回は、なぜ getItem を 2 回実行するのかという質問に人々がびっくりしました。最初の getItem は、名前内の項目を取得します。名前の中には必ず何かがあります。addItem は名前に追加し、getItem は再び名前を返しますが、Bill は中にあります。

さて、2番目の例のように機能することも私にとっては良いことです. getItem は名前を返し、addItem は名前に Bill を追加してから、bill を含むすべての名前を返します。

HTML5 API の一部である setItem を実行できますが、面倒です。

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 に答える