Function是Object的实例,Object是Function的实例?

时间:2016-11-16 13:13:22

标签: javascript

 console.log(Function instanceof Object);//true
 console.log(Object instanceof Function);//true

此代码取自文章:https://github.com/stevekwan/experiments/blob/master/javascript/object-vs-function.html

我想我理解什么是原型继承以及Js对象模型是如何工作的,但是这个循环链接在两个基本的hmm ..可能是构造函数(它是作为对象的函数......并且所有对象都是Object构造函数的实例... )功能和对象只是让我大吃一惊。

在面向类的语言中,我可以想象有一些基本的类Object,我所创建的每个类都会自动从它继承。

对我来说有时间一致性 - 类对象首先出现,然后我写的所有其他内容出现在第二个等等。我真的不明白两个构造函数是如何神奇地同时出现并且是彼此的实例。

3 个答案:

答案 0 :(得分:5)

请注意,FunctionObject都是引用函数的全局符号。因此,这两个函数都是ObjectFunction的实例,因为它们都继承自两个原型。

如果你这样做,那就不那么容易混淆了:

var a = Function, b = Object;

console.log(a instanceof Object);
console.log(b instanceof Object);
console.log(a instanceof Function);
console.log(b instanceof Function);

这些函数具有与其他函数一样的属性:

var c = function() {};

console.log(c instanceof Object);
console.log(c instanceof Function);

instanceof运算符的左侧,重要的是所涉及对象的性质。

答案 1 :(得分:3)

没有循环。 [[Prototype]]链中不能有循环。

Function instanceof Object表示Function的[[原型]]链包含Object.prototype

Object instanceof Function表示Object的[[原型]]链包含Function.prototype

这不是循环的,因为Object不在Object.prototype的[[原型]]链中,而Function不在Function.prototype的[[原型]]链中

[[Prototype]]链是

╭╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╮
╎ Function ━┓       /* Function instanceof Object */         ╎
╰╌╌╌╌╌╌╌╌╌╌╌┃╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╮                     ╎
╭╌╌╌╌╌╌╌╌╌╌╌┃╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╮ ╎                     ╎
╎           ┣━━❯ Function.prototype ━━━━━❯ Object.prototype ━━━❯ null
╎           ┃                        ╎ ╰╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╯
╎           ┃                        ╰╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╮
╎ Object ━━━┛       /* Object instanceof Function */         ╎
╰╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╯

答案 2 :(得分:1)

如果x instanceof y,则

x.__proto__.__proto__... = y.prototype为真。

Function__proto__(=其自己的原型)和prototype(=其儿童'的原型)相等的唯一构建对象(见图)。所以

 Function instanceof Object

持有,因为

 Function.__proto__.__proto__ === Object.prototype

 Object instanceof Function

持有,因为

 Object.__proto__ === Function.prototype

enter image description here