| | |
| | | var uncurryThis = require('../internals/function-uncurry-this'); |
| | | var fails = require('../internals/fails'); |
| | | var isCallable = require('../internals/is-callable'); |
| | | var classof = require('../internals/classof'); |
| | | var getBuiltIn = require('../internals/get-built-in'); |
| | | var inspectSource = require('../internals/inspect-source'); |
| | | |
| | | var noop = function () { /* empty */ }; |
| | | var empty = []; |
| | | var construct = getBuiltIn('Reflect', 'construct'); |
| | | var constructorRegExp = /^\s*(?:class|function)\b/; |
| | | var exec = constructorRegExp.exec; |
| | | var INCORRECT_TO_STRING = !constructorRegExp.exec(function () { /* empty */ }); |
| | | var exec = uncurryThis(constructorRegExp.exec); |
| | | var INCORRECT_TO_STRING = !constructorRegExp.exec(noop); |
| | | |
| | | var isConstructorModern = function (argument) { |
| | | var isConstructorModern = function isConstructor(argument) { |
| | | if (!isCallable(argument)) return false; |
| | | try { |
| | | construct(Object, empty, argument); |
| | | construct(noop, empty, argument); |
| | | return true; |
| | | } catch (error) { |
| | | return false; |
| | | } |
| | | }; |
| | | |
| | | var isConstructorLegacy = function (argument) { |
| | | var isConstructorLegacy = function isConstructor(argument) { |
| | | if (!isCallable(argument)) return false; |
| | | switch (classof(argument)) { |
| | | case 'AsyncFunction': |
| | | case 'GeneratorFunction': |
| | | case 'AsyncGeneratorFunction': return false; |
| | | } |
| | | try { |
| | | // we can't check .prototype since constructors produced by .bind haven't it |
| | | } return INCORRECT_TO_STRING || !!exec.call(constructorRegExp, inspectSource(argument)); |
| | | // `Function#toString` throws on some built-it function in some legacy engines |
| | | // (for example, `DOMQuad` and similar in FF41-) |
| | | return INCORRECT_TO_STRING || !!exec(constructorRegExp, inspectSource(argument)); |
| | | } catch (error) { |
| | | return true; |
| | | } |
| | | }; |
| | | |
| | | isConstructorLegacy.sham = true; |
| | | |
| | | // `IsConstructor` abstract operation |
| | | // https://tc39.es/ecma262/#sec-isconstructor |
| | | module.exports = !construct || fails(function () { |