| 'use strict'; |
| |
| var GetIntrinsic = require('../GetIntrinsic.js'); |
| |
| var $construct = GetIntrinsic('%Reflect.construct%', true); |
| |
| var DefinePropertyOrThrow = require('./DefinePropertyOrThrow'); |
| try { |
| DefinePropertyOrThrow({}, '', { '[[Get]]': function () {} }); |
| } catch (e) { |
| // Accessor properties aren't supported |
| DefinePropertyOrThrow = null; |
| } |
| |
| // https://ecma-international.org/ecma-262/6.0/#sec-isconstructor |
| |
| if (DefinePropertyOrThrow && $construct) { |
| var isConstructorMarker = {}; |
| var badArrayLike = {}; |
| DefinePropertyOrThrow(badArrayLike, 'length', { |
| '[[Get]]': function () { |
| throw isConstructorMarker; |
| }, |
| '[[Enumerable]]': true |
| }); |
| |
| module.exports = function IsConstructor(argument) { |
| try { |
| // `Reflect.construct` invokes `IsConstructor(target)` before `Get(args, 'length')`: |
| $construct(argument, badArrayLike); |
| } catch (err) { |
| return err === isConstructorMarker; |
| } |
| }; |
| } else { |
| module.exports = function IsConstructor(argument) { |
| // unfortunately there's no way to truly check this without try/catch `new argument` in old environments |
| return typeof argument === 'function' && !!argument.prototype; |
| }; |
| } |