core-js
Version:
Standard library
48 lines (43 loc) • 1.57 kB
JavaScript
;
var $ = require('./$')
, $def = require('./$.def')
, hide = require('./$.hide')
, forOf = require('./$.for-of')
, strictNew = require('./$.strict-new');
module.exports = function(NAME, wrapper, methods, common, IS_MAP, IS_WEAK){
var Base = require('./$.global')[NAME]
, C = Base
, ADDER = IS_MAP ? 'set' : 'add'
, proto = C && C.prototype
, O = {};
if(!require('./$.support-desc') || typeof C != 'function'
|| !(IS_WEAK || proto.forEach && !require('./$.fails')(function(){ new C().entries().next(); }))
){
// create collection constructor
C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);
require('./$.mix')(C.prototype, methods);
} else {
C = wrapper(function(target, iterable){
strictNew(target, C, NAME);
target._c = new Base;
if(iterable != undefined)forOf(iterable, IS_MAP, target[ADDER], target);
});
$.each.call('add,clear,delete,forEach,get,has,set,keys,values,entries'.split(','),function(KEY){
var chain = KEY == 'add' || KEY == 'set';
if(KEY in proto && !(IS_WEAK && KEY == 'clear'))hide(C.prototype, KEY, function(a, b){
var result = this._c[KEY](a === 0 ? 0 : a, b);
return chain ? this : result;
});
});
if('size' in proto)$.setDesc(C.prototype, 'size', {
get: function(){
return this._c.size;
}
});
}
require('./$.tag')(C, NAME);
O[NAME] = C;
$def($def.G + $def.W + $def.F, O);
if(!IS_WEAK)common.setStrong(C, NAME, IS_MAP);
return C;
};