我是 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.prototype
有 call
方法,但这不是 [[Call]] internal method 。它只是一个名为call
的方法。 [[Call]] 无法从外部访问(并且根据 JavaScript 引擎的实现,它可能并不真正存在;它是一种规范机制)。
要创建函数,您可以使用函数声明、函数表达式、方法定义等( more here );或者,如果您无法避免它们并且知道与它们相关的危险,请使用 eval
或 new Function
。
关于javascript - Typeof 对象不是函数,即使它实现了 [[Call]],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62455392/