Javascript 为什么**(Object.\uuu proto\uuuu instanceof Function)**==false?
为什么对象。_proto_instanceof Function给了我falseJavascript 为什么**(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); // ! 确
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