11

Storage.prototype.getItem、setItem、removeItem、clearをオーバーライドすることで、HTML5ストレージAPIをオーバーライドできることを知っています。ただし、これにより、ローカルストレージとセッションストレージの両方でこれらのメソッドが上書きされます。

一方をオーバーライドし、もう一方をオーバーライドすることはできませんか?または、両方を別々にオーバーライドするには?

少しコンテキスト:ローカルストレージとセッションストレージの両方を非常に多用する既存のアプリがあります。別のストレージメカニズムのローカルストレージにあるものをミラーリングするための一時的なコードを追加したいのですが、セッションストレージの内容を一緒にドラッグしたくありません。

localStorageへのすべての参照を更新して、ミラーリングを実行できるラッパー関数を呼び出すことはできますが、これらの呼び出しをすべて更新する必要はありません。単一のストレージメソッドのセットをオーバーライドしてこのコードをローカライズできれば、はるかにクリーンになります。

4

2 に答える 2

16

あなたが望むものを達成するためのいくつかの可能性があります。ただし、これらはいずれも実稼働環境では使用しないでください。

最初のオプションは、メソッドがまたはオブジェクトsetItemによって呼び出されたかどうかを検出します。あなたはそれをこのように書くことができます:sessionStoragelocalStorage

var _setItem = Storage.prototype.setItem;

Storage.prototype.setItem = function(key, value) { 
    if (this === window.localStorage) {
         // do what you want if setItem is called on localStorage
    } else {
         // fallback to default action
         _setItem.apply(this, arguments);
    }
}

sessionStorage2つ目は、またはlocalStorageオブジェクトのプロトタイプを置き換えます。次のようになります。

localStorage.__proto__ = Object.create(Storage.prototype);
localStorage.__proto__.setItem = function() {
    // your logic here
}

__proto__非標準ですが、ChromeとFirefoxで公開されている疑似プロパティを使用したことに注意してください。(Opera、Safariなどについては知りません)。ただし、ご覧のとおり、開発中に役立つ場合があります。

于 2012-11-28T20:22:53.847 に答える
-2

はい、ローカルストレージとセッションストレージはHTML5で別々にオーバーライドします

localStorage.setItem('name', Krishna); //here local storege value is Krishna
sessionStorage.name = "Krishna"; //here Session storege value is Krishna

以下では、ローカルストレージとセッションストレージの値を別々にオーバーライドします

localStorage.setItem('name', Sri); //here local storege value is Sri
sessionStorage.name = "Pal"; //here Session storege value is Pal
于 2018-06-29T20:22:35.067 に答える