Javascript 为什么**(Object.\uuu proto\uuuu instanceof Function)**==false?

Javascript 为什么**(Object.\uuu proto\uuuu instanceof Function)**==false?,javascript,ecmascript-5,Javascript,Ecmascript 5,为什么对象。_proto_instanceof Function给了我false alert(Object.__proto__ ); // clearly Object.__proto__ is a function right? alert(typeof Object.__proto__); // clearly Object.__proto__ is a function right? alert(Object.__proto__ instanceof Function); // ! 确

为什么对象。_proto_instanceof Function给了我false

alert(Object.__proto__ ); //  clearly Object.__proto__ is a function right?
alert(typeof Object.__proto__); // clearly Object.__proto__ is a function right?
alert(Object.__proto__ instanceof Function); // !

确切地说,这是一个函数。但是,它不是一个函数对象。这就是instanceof返回false的原因。您可以阅读有关instanceof的所有信息

并非所有函数都是通过
函数
构造函数创建的
instanceof
专门检查给定项是否由该特定函数创建

在处理多个窗口时,在浏览器环境中也会得到类似的效果。我的意思是,如果在窗口A中有函数
foo

function foo(arg) {
    if (arg instanceof Array) {
        // It's an array, do something
    }
}
…在另一个窗口B中有代码调用它:

opener.foo([]);
…然后您希望
foo
认识到
arg
是一个数组,对吗?但是它不是,因为尽管
arg
是一个数组,但它不是由
foo
所在窗口中的
array
构造函数创建的

更多关于了解此处的内容:

如果你被这些东西迷住了(就像你看起来的那样),没有什么比读书更好的了。是的,散文是…枯燥的…术语是…密集的…但随着你越来越多地了解底层工作,它变得越来越有趣



主题外:请注意,
\uuu proto\uuuu
是非标准的,并非所有JavaScript实现都支持。

本文中的图片将帮助您理解函数与对象的关系


以神秘结尾:

什么是
对象

  • 它只是对
    函数.prototype
    对象的引用

    Object.__proto__ === Function.prototype; // true
    
构造函数几乎与所有内置函数和用户定义函数一样,继承自
Function.prototype

这个对象(
Function.prototype
)是一个函数对象,但显然,一个对象不能从自身继承,这就是为什么它从
object.prototype
继承

您的测试:

Object.__proto__ instanceof Function;   // false, which is equivalent to:
Function.prototype instanceof Function; // false
只是告诉我们
函数。prototype
对象不在
函数的prototype链上。prototype
本身:

Function.prototype.isPrototypeOf(Function.prototype); // false, equivalent to:
Object.prototype.isPrototypeOf.call(Function.prototype, Function.prototype);
如前所述,如果您感兴趣,可以使用以下特征描述此对象:

  • 它是一个函数对象(实现内部方法)

  • 它的
    [[Class]]
    内部属性的值是
    “Function”

  • [[Prototype]]
    内部属性的值指向
    Object.Prototype
    (如您现在所知)

  • 可以使用任意数量的参数调用

  • 它总是返回未定义的

  • 它的
    length
    属性是
    0

  • [[Extensible]]
    内部属性的初始值为
    true


“然而,它不是一个函数对象。”它很可能是一个函数对象(事实上,它可能是)。只是不是一个通过特定的
函数创建的构造函数。+1-这个“说什么?”链接是一个很好的资源。又好又简洁。哈哈,我刚意识到这是你的博客。为你干杯@麦克斯特朗:哈哈!嗯,也许我应该贴上免责声明之类的标签。。。恩,到目前为止没有投诉哈哈,不,这很有用,我不认为你在试图提供帮助时需要免责声明。@t.K.Crowder,当你说“你实际上不需要多个窗口来实现这一点,但这是浏览器应用程序中最常见的方式。你必须做一些深奥的事情才能实现它。”你指的是什么深奥的方式?
Function.prototype.isPrototypeOf(Function.prototype); // false, equivalent to:
Object.prototype.isPrototypeOf.call(Function.prototype, Function.prototype);
typeof Function.prototype; // "function"
Object.prototype.toString.call(Function.prototype); // "[object Function]"
Object.prototype.isPrototypeOf(Function.prototype); // true