| 'use strict'; |
| |
| var GetIntrinsic = require('get-intrinsic'); |
| |
| var $species = GetIntrinsic('%Symbol.species%', true); |
| var $TypeError = GetIntrinsic('%TypeError%'); |
| |
| var IsConstructor = require('./IsConstructor'); |
| var Type = require('./Type'); |
| |
| // https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor |
| |
| module.exports = function SpeciesConstructor(O, defaultConstructor) { |
| if (Type(O) !== 'Object') { |
| throw new $TypeError('Assertion failed: Type(O) is not Object'); |
| } |
| var C = O.constructor; |
| if (typeof C === 'undefined') { |
| return defaultConstructor; |
| } |
| if (Type(C) !== 'Object') { |
| throw new $TypeError('O.constructor is not an Object'); |
| } |
| var S = $species ? C[$species] : void 0; |
| if (S == null) { |
| return defaultConstructor; |
| } |
| if (IsConstructor(S)) { |
| return S; |
| } |
| throw new $TypeError('no constructor found'); |
| }; |