let wmUniqueIndex = Math.round(Math.random() * 9);
|
|
const supportDefineProperty = typeof Object.defineProperty === 'function';
|
|
export default class WeakMap<K extends object, V> {
|
|
protected _id: string;
|
|
constructor() {
|
this._id = '__ec_inner_' + wmUniqueIndex++;
|
}
|
|
get(key: K): V {
|
return (this._guard(key) as any)[this._id];
|
}
|
|
set(key: K, value: V): WeakMap<K, V> {
|
const target = this._guard(key) as any;
|
if (supportDefineProperty) {
|
Object.defineProperty(target, this._id, {
|
value: value,
|
enumerable: false,
|
configurable: true
|
});
|
}
|
else {
|
target[this._id] = value;
|
}
|
return this;
|
}
|
|
delete(key: K): boolean {
|
if (this.has(key)) {
|
delete (this._guard(key) as any)[this._id];
|
return true;
|
}
|
return false;
|
}
|
|
has(key: K): boolean {
|
return !!(this._guard(key) as any)[this._id];
|
}
|
|
protected _guard(key: K): K {
|
if (key !== Object(key)) {
|
throw TypeError('Value of WeakMap is not a non-null object.');
|
}
|
return key;
|
}
|
}
|