为什么**(对象.__ proto__ instanceof函数)** === false?

时间:2011-05-11 12:06:50

标签: javascript ecmascript-5

为什么对象._ 原型 _ instanceof功能给我假?

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 个答案:

答案 0 :(得分:4)

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

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

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

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

opener.foo([]);

...那么你期望foo意识到arg是一个数组,对吗?但事实并非如此,因为尽管arg 数组,但它并非由Array所在窗口中的foo构造函数创建。 / p>

更多关于弄清楚这里有什么:Say what?

如果你对这些东西很着迷(就像你看起来那样),那就没有什么比阅读the specification更像了。是的,散文是......干......而且术语......密集......但随着你越来越多地了解基础工作,它会变得越来越有趣。


偏离主题:请注意__proto__是非标准的,并且不受所有JavaScript实施的支持。

答案 1 :(得分:3)

以神秘结束:

究竟是什么Object.__proto__

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

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

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

此对象(Function.prototypedescribed in the specification功能对象,但很明显,对象无法从自身继承,这就是它继承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);

正如我之前所说,如果您感兴趣,in the specification此对象具有以下特征:

  • 它是一个函数对象(实现[[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

答案 2 :(得分: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 here的所有内容。

答案 3 :(得分:0)

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

JavaScript Object Layout

相关问题