为什么对象._ 原型 _ 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); // !
答案 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.prototype
)described 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)
这篇文章中的图片将帮助您理解功能与对象的关系