轉載:http://www.108js.com/article/article1/10201.html?id=1092javascript
請先瞻仰上邊的這篇文章。html
對象的原型鏈:java
box.__proto__.__proto__ == Object.prototype函數
//truethis
上邊對象的__proto__的屬性討論完了,咱們來看函數。prototype
person3d
普通函數的__proto__屬性:htm
person.__proto__ == Function.prototype //true對象
person.__proto //function(){}blog
box.__proto__ == person.prototype //true 這個是確定的。
box.__proto__這個也是一個對象,這個對象的__proto__屬性是什麼呢
box.__proto__.__proto__ == Object.prototype//true
下邊咱們來討論Function.prototype 和Object.prototype的理解
Object.prototype
Function.prototype //function(){}
Function.prototype === Object.__proto__ //true
Function.prototype === Object.prototype //false
下邊的一段話,咱們能夠看到:
javascript中,「函數」(方法)也是對象。
一切對象都有一個根源。它是Object.prototype。
根源之上再沒有其餘根源。Object.getPrototypeOf(Object.prototype)是null。js中除字面量之外的一切引用對象都來自這個「根源」對象。
表達式Object.getPrototypeOf(Function) === Function.prototype的結果是真。這是Function特有的。實際上Function的prototype是一個內置函數,一切函數都派生自這個內置函數,這個內置函數是一個函數工廠。這個內置函數對象的prototype指向「根源」對象。
表達式Object.prototype === Object.getPrototypeOf(Function.prototype)的結果是真。說明了Object跟Function兩者之間的聯繫,是經過「根源」對象聯繫起來的。
Function和Object,既是函數,由於均可以Function()或者Object()這樣的方式執行,又是對象,由於能夠Function.a = 'a',Object.a = 'a'這樣賦值。
說它們是函數,是由於他們都是經過上面第4條中說的」內置函數工廠「,派生出來的,於是具有函數的特性。
說他們是對象。是由於他們都是經過上面第1條中的」根源「對象,派生出來的,所以具有對象的特徵。
繼續說一下,Function.prototype指向」內置函數「。而Object.prototype指向」根源對象「。
於是new Function會產生一個匿名函數,而new Object產生一個plain object。
他們之間的關係簡單描述就像下面這樣。
=====================================================================
constructor
何時function會變爲構造器呢?
當方法的返回值爲this的時候,或者說默認的返回值就是this.
當方法的返回值是匿名函數的時候,function就再也不是匿名 函數
另外一種狀況返回this,或者不返回的時候: