Spaces:
Configuration error
Configuration error
; | |
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://262.ecma-international.org/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; | |
}; | |
} | |