3

为什么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); // !
4

4 回答 4

4

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

在处理多个窗口时,您会在浏览器环境中获得类似的效果。我的意思是,如果您foo在窗口 A 中有功能:

function foo(arg) {
    if (arg instanceof Array) {
        // It's an array, do something
    }
}

...并且您在另一个窗口B 中有代码调用它:

opener.foo([]);

...那么您会期望foo意识到这arg是一个数组,对吗?但它没有,因为虽然它arg 一个数组,但它不是由Array所在窗口中的构造函数创建的foo

更多关于弄清楚这里有什么东西:说什么?

如果您对这些东西很着迷(就像您看起来的那样),那么没有什么比阅读规范更有趣了。是的,散文是……枯燥的……术语是……密集的……但是随着您对底层工作原理的了解越来越多,它变得越来越有趣。


题外话:当心这__proto__是非标准的,并非所有 JavaScript 实现都支持。

于 2011-05-11T12:12:06.103 回答
3

以神秘结束:

究竟是Object.__proto__什么?

  • 它只是对Function.prototype对象的引用。

    Object.__proto__ === Function.prototype; // true
    

几乎所有内置和用户定义函数的Object构造函数都继承自.Function.prototype

这个对象 ( Function.prototype)在规范中被描述为一个Function 对象,但很明显,一个对象不能从它自己继承,这就是它继承自的原因Object.protoype

你的测试:

Object.__proto__ instanceof Function;   // false, which is equivalent to:
Function.prototype instanceof Function; // false

只是告诉我们该Function.prototype对象不在其自身的原型链Function.prototype

Function.prototype.isPrototypeOf(Function.prototype); // false, equivalent to:
Object.prototype.isPrototypeOf.call(Function.prototype, Function.prototype);

正如我之前所说,如果您有兴趣,在规范中描述的这个对象具有以下特征:

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

    typeof Function.prototype; // "function"
    
  • [[Class]]内部属性值为"Function"

    Object.prototype.toString.call(Function.prototype); // "[object Function]"
    
  • [[Prototype]]内部属性的值指向Object.prototype(如您现在所知)。

    Object.prototype.isPrototypeOf(Function.prototype); // true
    
  • 可以使用任意数量的参数调用。

  • 它总是返回undefined值。

  • 它的length属性是0

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

于 2011-05-12T18:27:03.730 回答
2
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 的所有信息。

于 2011-05-11T12:10:55.490 回答
0

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

JavaScript 对象布局

于 2011-05-11T12:13:39.107 回答