Объект Typeof не является функцией, хотя он реализует [[Call]] - PullRequest
1 голос
/ 18 июня 2020

Я новичок в Javascript, поэтому извиняюсь, если есть тривиальный ответ.

Согласно спецификации языка ECMAScript, если тип возвращаемого значения val равен Object (implements [[Call]]), результатом будет строка «функция». Я не понимаю, почему в следующем коде тип вновь созданного объекта не является "функцией":

function FunctionCreator(){}

FunctionCreator.prototype = Function.prototype;

let obj = new FunctionCreator();

console.log(typeof obj); // object
console.log(obj.call); // ƒ call() { [native code] }

Метод [[Call]] определен в Function.prototype, так же, как я полагаю, он определен для нормальной функции, но все же typeof возвращает объект.

1 Ответ

2 голосов
/ 18 июня 2020

obj не функция, это объект, созданный с помощью оператора new. FunctionCreator - это функция, но она не создает функций. Простое создание его прототипа Function.prototype не делает то, что он создает, функции, это просто заставляет объект наследовать свойства, которые нельзя использовать с пользой, потому что это не функция.

[[Call ]] метод определен в Function.prototype ...

Это может быть то, что вы неправильно поняли. Function.prototype имеет метод call, но это не внутренний метод [[Call]] . Это просто метод под названием call. [[Call]] недоступен извне (и в зависимости от реализации механизма JavaScript он может не существовать буквально; это механизм спецификации).

Для создания функции вы используете объявление функции , выражение функции, определение метода и т. д. c. ( подробнее здесь ); или, если вы не можете их избежать и знаете, какие опасности с ними связаны, eval или new Function.

...