Einige window
Objekte wie location
sind schreibgeschützt, es kann nützlich sein, Abstraktionen über sie zu erstellen oder DI für die Testbarkeit zu verwenden.
sessionStorage
soll verwendet werden wie es ist. Normalerweise werden keine Abstraktionen darüber benötigt. Wenn die Funktionalität erweitert oder geändert werden soll, kann eine benutzerdefinierte Klasse erstellt werden. Es kann Storage Schnittstelle implementieren oder eigene besitzen.
Die Verwendung von Proxy
ist hier nicht gerechtfertigt. Es ist langsam und beschränkt die Verwendung des Codes in ES5-Umgebungen.
Benutzerdefinierte Klassen oder Objekte können nur die ursprünglichen sessionStorage
Methoden umbrechen. Da Lagerung API klein ist, in den Ergebnissen Wrapper-Klasse ~ 20 Zeilen Code:
class CustomSessionStorage {
get length() {
return sessionStorage.length;
}
getItem(key) {
return sessionStorage.getItem(key);
}
...
}
sessionStorage
Objekt ist exotisch. Obwohl es von Storage
erbt, ist Storage
kein Konstruktor, und sessionStorage
Methoden sollten direkt an sessionStorage
gebunden werden, so dass es nicht möglich ist, es nur mit CustomSessionStorage.prototype = sessionStorage
arbeiten zu lassen. Zusätzlich sessionStorage
hat length
Eigenschaft Beschreibung, die auch gebunden werden sollte.
Eine allgemeinere Art und Weise, sie zu verlängern ist eine Basisklasse zu schaffen, die ursprünglichen Methoden wickelt und kann weiter ausgebaut werden:
function BaseSessionStorage() {}
for (let prop of Object.getOwnPropertyNames(Storage.prototype)) {
if (typeof sessionStorage[prop] === 'function') {
// bind all sessionStorage methods
BaseSessionStorage.prototype[prop] = sessionStorage[prop].bind(sessionStorage);
} else {
// a proxy for other props, length is read-only getter
Object.defineProperty(BaseSessionStorage.prototype, prop, {
get:() => sessionStorage[prop],
set: val => { sessionStorage[prop] = val }
});
}
}
class CustomSessionStorage extends BaseSessionStorage {
getItem(key) {
return super.getItem(key);
}
// the rest of API is inherited
}
ich einen Proxy benötigen, wenn ich benutzerdefinierte Methoden für eine native Objekt implementieren möchten aber tun Ich möchte nicht alle implementieren. Es geht nicht anders. Wenn ich "JSON.stringify" -Daten immer wenn ich etwas setze und "JSON.parse" erhalte ich bekomme ein Element 90% der Zeit werde ich nicht jedes Mal tun. Ich möchte einfach, dass mein Proxylayer sich darum kümmert. –
Ich sehe keinen wirklichen Bedarf für Proxy hier. Dies kann durch eine reguläre Klasse (oder wahrscheinlich ein Objekt, da ein Speicher ein Singleton sein soll) gehandhabt werden. Bezüglich der ursprünglichen Frage: * Wie greife ich wieder auf diesen Gültigkeitsbereich zu? *, Müssen Sie ihn explizit als 'sessionStorage.setItem()' innerhalb von 'setItem' bezeichnen. Sie können 'this' in Proxy-Methoden verwenden, aber nur, wenn eine Methode anders aufgerufen wird:' set (k, v) {this.setItem (a, msg)} '. – estus
Wenn Sie das Original einfach umbrechen, müssen Sie auch alle Methoden implementieren, wenn es sich wie das native 'sessionStorage'-Objekt verhalten soll. –