| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 | 'use strict';var $ = require('../internals/export');var getBuiltIn = require('../internals/get-built-in');var apply = require('../internals/function-apply');var bind = require('../internals/function-bind');var aConstructor = require('../internals/a-constructor');var anObject = require('../internals/an-object');var isObject = require('../internals/is-object');var create = require('../internals/object-create');var fails = require('../internals/fails');var nativeConstruct = getBuiltIn('Reflect', 'construct');var ObjectPrototype = Object.prototype;var push = [].push;// `Reflect.construct` method// https://tc39.es/ecma262/#sec-reflect.construct// MS Edge supports only 2 arguments and argumentsList argument is optional// FF Nightly sets third argument as `new.target`, but does not create `this` from itvar NEW_TARGET_BUG = fails(function () {  function F() { /* empty */ }  return !(nativeConstruct(function () { /* empty */ }, [], F) instanceof F);});var ARGS_BUG = !fails(function () {  nativeConstruct(function () { /* empty */ });});var FORCED = NEW_TARGET_BUG || ARGS_BUG;$({ target: 'Reflect', stat: true, forced: FORCED, sham: FORCED }, {  construct: function construct(Target, args /* , newTarget */) {    aConstructor(Target);    anObject(args);    var newTarget = arguments.length < 3 ? Target : aConstructor(arguments[2]);    if (ARGS_BUG && !NEW_TARGET_BUG) return nativeConstruct(Target, args, newTarget);    if (Target === newTarget) {      // w/o altered newTarget, optimization for 0-4 arguments      switch (args.length) {        case 0: return new Target();        case 1: return new Target(args[0]);        case 2: return new Target(args[0], args[1]);        case 3: return new Target(args[0], args[1], args[2]);        case 4: return new Target(args[0], args[1], args[2], args[3]);      }      // w/o altered newTarget, lot of arguments case      var $args = [null];      apply(push, $args, args);      return new (apply(bind, Target, $args))();    }    // with altered newTarget, not support built-in constructors    var proto = newTarget.prototype;    var instance = create(isObject(proto) ? proto : ObjectPrototype);    var result = apply(Target, instance, args);    return isObject(result) ? result : instance;  }});
 |