【问题标题】:Typeof object is not function even though it implements [[Call]]Typeof 对象不是函数,即使它实现了 [[Call]]
【发布时间】:2020-10-08 19:55:07
【问题描述】:

我是 Javascript 的新手,所以如果这有一个微不足道的答案,我们深表歉意。

根据 ECMAScript 语言规范,如果 val 的返回类型为 Object (implements [[Call]]),则结果为字符串“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 返回对象。

【问题讨论】:

    标签: javascript types typeof


    【解决方案1】:

    obj 不是函数,它是通过new 运算符创建的对象。 FunctionCreator 是一个函数,但它不创建函数。仅仅制作它的原型Function.prototype 并没有让它创建函数,它只是让对象继承了不能有用的属性,因为它不是一个函数。

    [[Call]] 方法定义在 Function.prototype...

    这可能是您的误解。 Function.prototype 有一个 call 方法,但这不是 [[Call]] internal method。这只是一个名为call 的方法。 [[Call]] 无法从外部访问(并且取决于 JavaScript 引擎的实现,它可能实际上并不存在;它是一种规范机制)。

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

    【讨论】:

    • 感谢@PoulKruijt 的错字修复!
    猜你喜欢
    • 1970-01-01
    • 2017-12-28
    • 2021-07-26
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    相关资源
    最近更新 更多