You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
40 lines
1.1 KiB
40 lines
1.1 KiB
'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; |
|
}; |
|
}
|
|
|