Created
December 19, 2019 02:18
-
-
Save htsign/faa960165515e9e922f370c54a5caf74 to your computer and use it in GitHub Desktop.
simple implementation of Storage interface
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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