Skip to content

Instantly share code, notes, and snippets.

@htsign
Created December 19, 2019 02:18
Show Gist options
  • Save htsign/faa960165515e9e922f370c54a5caf74 to your computer and use it in GitHub Desktop.
Save htsign/faa960165515e9e922f370c54a5caf74 to your computer and use it in GitHub Desktop.
simple implementation of Storage interface
export const MyStorage = (() => {
const sym = Symbol();
return class MyStorage {
constructor() {
if (arguments[0] !== sym) {
return new Proxy(new MyStorage(sym), {
get(target, prop) {
if (prop === 'length') return target.length;
const v = Reflect.get(target, prop);
return typeof v === 'function' ? v.bind(target) : target.getItem(prop);
},
set(target, prop, value) {
target.setItem(prop, value);
return true;
},
deleteProperty(target, prop) {
target.removeItem(prop);
return true;
},
});
}
this.data = new Map();
}
key(n) {
return [...this.data.keys()][n];
}
getItem(key) {
return this.data.has(key) ? this.data.get(key) : null;
}
setItem(key, value) {
this.data.set(key, value);
}
removeItem(key) {
this.data.delete(key);
}
clear() {
this.data.clear();
}
get length() {
return [...this.data.keys()].length;
}
}
})();
export const myStorage = new MyStorage();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment