2016-11-16 138 views
4
console.log(Function instanceof Object);//true 
console.log(Object instanceof Function);//true 

此代碼是從文章採取:https://github.com/stevekwan/experiments/blob/master/javascript/object-vs-function.html函數是Object的實例,Object是Function的實例?

我想我明白了什麼是原型繼承,以及如何的js對象模型的工作原理,但兩個基本嗯..大概構造之間的循環鏈接(這是功能,這是對象..和所有的對象都是對象構造函數的實例...)函數和對象只是在打擊我的思想。

在面向類的語言中,我可以想象有一些基本的類對象,並且我創建的每個類都自動從它繼承。

對我來說,有時間一致性 - 首先出現類對象,然後我寫的所有其他東西出現在第二等等。我真的不明白兩個構造函數如何神奇地同時出現並且是彼此的實例。

回答

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運營商的左側,所有的重要的是涉及的對象的性質。

+0

尖尖的,謝謝你的答覆。 「請注意,函數和對象都是引用函數的全局符號,因此這兩個函數都是對象和函數的實例,因爲它們都是從這兩個原型繼承的。」 對象如何可以是它自己的實例? – User15

+0

@ User15符號「對象」是指對象的構造函數。人們通常不會寫'x = new Object()',但是如果你願意,你可以這樣做。所以這個構造函數是一個函數。就像這樣,它是一個對象,就像JavaScript中的其他函數一樣。 **所有**函數都是對象,包括特殊對象類型的全局構造函數。不要掛上它看起來很古怪的樣子 - 記住'typeof'的左邊被評估爲它的基本值,然後檢查類型。不要緊,它被稱爲「對象」。 – Pointy

3

沒有循環。 [[Prototype]]鏈中不能有循環。

Function instanceof Object意味着Function的[[Prototype]]鏈包含Object.prototype

Object instanceof Function意味着Object的[[Prototype]]鏈包括Function.prototype

它不是圓形的,因爲Object不在的Object.prototypeFunction的[[原型]]鏈是不是在Function.prototype的[[原型]]鏈。

的[[原型]]鏈是如果x.__proto__.__proto__... = y.prototype

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

令人敬畏的繪畫,+1!你可以通過使用代碼迭代每個對象的'__proto__'鏈來將你的觀點驅動回家。 –

1

x instanceof y是真實的。

Function__proto__(=它自己的原型)和prototype(=它的'children'的原型)相等的唯一內置對象(請參見圖片)。所以

Function instanceof Object 

成立是因爲

Function.__proto__.__proto__ === Object.prototype 

Object instanceof Function 

成立是因爲

Object.__proto__ === Function.prototype 

enter image description here

相關問題