瞭解JavaScript中原型以及原型鏈只須要記住如下2點便可javascript
Number.__proto__ === Function.prototype // true Boolean.__proto__ === Function.prototype // true String.__proto__ === Function.prototype // true Object.__proto__ === Function.prototype // true Function.__proto__ === Function.prototype // true Array.__proto__ === Function.prototype // true RegExp.__proto__ === Function.prototype // true Error.__proto__ === Function.prototype // true Date.__proto__ === Function.prototype // true
可知全部的構造函數都繼承於Function.prototype , 甚至包括根構造器Object及Function自身。全部構造器都繼承了Function.prototype的屬性及方法,如length、call、apply、bind等。java
既然全部的構造器都來自於Function.prototype, 那麼Function.prototype 是什麼呢?app
Object.prototype.toString.call(Function.prototype) "[object Function]" Function.prototype(); //undefined
Function.prototype 是函數,是否是很意外!!!函數
既然 Function.prototype 是函數,那麼它就是 Function 的實例,然而並非這樣的!!!spa
Function.prototype.__proto__ === Function.prototype // false Function.prototype.__proto__ === Object.prototype // true
如何理解 Function.prototype 不是 Function 實例的怪異行爲呢?解決怪異行爲的根本方法是讓它顯得不那麼怪異,看下面代碼。prototype
Object.prototype.toString.call(Number.prototype) "[object Number]" Number.prototype.__proto__ === Number.prototype // false Number.prototype.__proto__ === Object.prototype // true Object.prototype.toString.call(String.prototype) "[object String]" String.prototype.__proto__ === String.prototype // false String.prototype.__proto__ === Object.prototype // true Object.prototype.toString.call(Array.prototype) "[object Array]" Number.prototype.__proto__ === Array.prototype // false Number.prototype.__proto__ === Object.prototype // true
簡單理解:內置構造函數的數據類型是對應的構造函數,但不是其對應構造函數的實例,而是Object的實例。code
構造函數\函數都有prototype屬性,指向構造函數函數的原型,原型有constructor屬性,指向構造函數\函數對象
Number.prototype.constructor === Number // true Function.prototype.constructor === Function //true Object.prototype.constructor === Object true
function wang(){}; wang.prototype.constructor === wang //true