var NATIVE_WEAK_MAP = require('../internals/native-weak-map');
var global = require('../internals/global');
+var uncurryThis = require('../internals/function-uncurry-this');
var isObject = require('../internals/is-object');
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-var objectHas = require('../internals/has');
+var hasOwn = require('../internals/has-own-property');
var shared = require('../internals/shared-store');
var sharedKey = require('../internals/shared-key');
var hiddenKeys = require('../internals/hidden-keys');
+var OBJECT_ALREADY_INITIALIZED = 'Object already initialized';
+var TypeError = global.TypeError;
var WeakMap = global.WeakMap;
var set, get, has;
};
};
-if (NATIVE_WEAK_MAP) {
+if (NATIVE_WEAK_MAP || shared.state) {
var store = shared.state || (shared.state = new WeakMap());
- var wmget = store.get;
- var wmhas = store.has;
- var wmset = store.set;
+ var wmget = uncurryThis(store.get);
+ var wmhas = uncurryThis(store.has);
+ var wmset = uncurryThis(store.set);
set = function (it, metadata) {
+ if (wmhas(store, it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);
metadata.facade = it;
- wmset.call(store, it, metadata);
+ wmset(store, it, metadata);
return metadata;
};
get = function (it) {
- return wmget.call(store, it) || {};
+ return wmget(store, it) || {};
};
has = function (it) {
- return wmhas.call(store, it);
+ return wmhas(store, it);
};
} else {
var STATE = sharedKey('state');
hiddenKeys[STATE] = true;
set = function (it, metadata) {
+ if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);
metadata.facade = it;
createNonEnumerableProperty(it, STATE, metadata);
return metadata;
};
get = function (it) {
- return objectHas(it, STATE) ? it[STATE] : {};
+ return hasOwn(it, STATE) ? it[STATE] : {};
};
has = function (it) {
- return objectHas(it, STATE);
+ return hasOwn(it, STATE);
};
}