You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
2.0 KiB
JavaScript
59 lines
2.0 KiB
JavaScript
7 years ago
|
'use strict';
|
||
|
var global = require('./_global')
|
||
|
, $export = require('./_export')
|
||
|
, meta = require('./_meta')
|
||
|
, fails = require('./_fails')
|
||
|
, hide = require('./_hide')
|
||
|
, redefineAll = require('./_redefine-all')
|
||
|
, forOf = require('./_for-of')
|
||
|
, anInstance = require('./_an-instance')
|
||
|
, isObject = require('./_is-object')
|
||
|
, setToStringTag = require('./_set-to-string-tag')
|
||
|
, dP = require('./_object-dp').f
|
||
|
, each = require('./_array-methods')(0)
|
||
|
, DESCRIPTORS = require('./_descriptors');
|
||
|
|
||
|
module.exports = function(NAME, wrapper, methods, common, IS_MAP, IS_WEAK){
|
||
|
var Base = global[NAME]
|
||
|
, C = Base
|
||
|
, ADDER = IS_MAP ? 'set' : 'add'
|
||
|
, proto = C && C.prototype
|
||
|
, O = {};
|
||
|
if(!DESCRIPTORS || typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function(){
|
||
|
new C().entries().next();
|
||
|
}))){
|
||
|
// create collection constructor
|
||
|
C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);
|
||
|
redefineAll(C.prototype, methods);
|
||
|
meta.NEED = true;
|
||
|
} else {
|
||
|
C = wrapper(function(target, iterable){
|
||
|
anInstance(target, C, NAME, '_c');
|
||
|
target._c = new Base;
|
||
|
if(iterable != undefined)forOf(iterable, IS_MAP, target[ADDER], target);
|
||
|
});
|
||
|
each('add,clear,delete,forEach,get,has,set,keys,values,entries,toJSON'.split(','),function(KEY){
|
||
|
var IS_ADDER = KEY == 'add' || KEY == 'set';
|
||
|
if(KEY in proto && !(IS_WEAK && KEY == 'clear'))hide(C.prototype, KEY, function(a, b){
|
||
|
anInstance(this, C, KEY);
|
||
|
if(!IS_ADDER && IS_WEAK && !isObject(a))return KEY == 'get' ? undefined : false;
|
||
|
var result = this._c[KEY](a === 0 ? 0 : a, b);
|
||
|
return IS_ADDER ? this : result;
|
||
|
});
|
||
|
});
|
||
|
if('size' in proto)dP(C.prototype, 'size', {
|
||
|
get: function(){
|
||
|
return this._c.size;
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
setToStringTag(C, NAME);
|
||
|
|
||
|
O[NAME] = C;
|
||
|
$export($export.G + $export.W + $export.F, O);
|
||
|
|
||
|
if(!IS_WEAK)common.setStrong(C, NAME, IS_MAP);
|
||
|
|
||
|
return C;
|
||
|
};
|