javascript - Typeof 对象不是函数,即使它实现了 [[Call]]

标签 javascript types typeof

我是 Javascript 新手,所以如果这个答案很简单,我深表歉意。

根据 ECMAScript 语言规范,如果 val 的返回类型是 Object (implements [[Call]]) 则结果是字符串“function”。我不明白的是为什么在下面的代码中,新创建的对象的类型不是“function”:

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 返回对象。

最佳答案

obj 不是一个函数,它是通过 new 运算符创建的对象。 FunctionCreator 是一个函数,但它不创建函数。仅使其原型(prototype) Function.prototype 并不会使其创建函数,它只会使对象继承无法有效使用的属性,因为它不是函数。

The [[Call]] method is defined in Function.prototype...

这可能是你的误解。 Function.prototypecall方法,但这不是 [[Call]] internal method 。它只是一个名为call 的方法。 [[Call]] 无法从外部访问(并且根据 JavaScript 引擎的实现,它可能并不真正存在;它是一种规范机制)。

要创建函数,您可以使用函数声明、函数表达式、方法定义等( more here );或者,如果您无法避免它们并且知道与它们相关的危险,请使用 evalnew Function

关于javascript - Typeof 对象不是函数,即使它实现了 [[Call]],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62455392/

相关文章:

javascript - 为什么使用 ('function' === typeof x) 而不是 (typeof x === 'function' )

javascript - 我怎样才能逃避 React useEffect 无限循环?

javascript - JavaScript 中的微秒计时

javascript - Laravel 5 分页 + 无限滚动 jQuery

javascript - 使用 jQuery 扩展 DOM 元素

haskell - 模式匹配数据类型及其在 Haskell 中的嵌套名称

excel - 如何验证 2 个变量是整数类型?

c++ - 为什么 back_insert_iterator/front_insert_iterator/insert_iterator 的 value_type/difference_type/pointer/reference 都是 void?

javascript - 为什么 "string"- "string"是 NaN?

c - 为什么 unsigned typeof(var) 不起作用? const typeof(x) 工作得很好,为什么不呢?