我想javascript中的原型鏈一直想不少初學javascript的同窗感到很是的困惑,今天看了一些文章,結合本身的理解,把原型鏈這個東西重新來整理一下,若有不對之處,望你們幫忙指出。javascript
首先,咱們應該認識的一個問題是,js中的繼承是指對__proto__的繼承,而不是prototype,這裏有同窗要問了:「那他們兩個有麼子區別呢?」, 請看官方的定義:java
1. A function's .prototype is actually the prototype of things made by it, not its prototype.
2. __proto__ is the actual prototype, but don't use it. app
好吧, 我不知道它在說些事什麼鳥東西。下面咱們繼續往下看,函數
全部構造函數的__proto__都指向Function.prototype,它是一個空函數(Empty function)spa
alert(Number.__proto__ === Function.prototype); //ture alert(Number.__proto__); //function Empty(){}
還有些內置對象好比Math,JSON是以對象形式存在的,無需new。它們的__proto__是Object.prototypeprototype
alert(Math.__proto__ === Object.prototype); //true alert(Math.__proto__); //Object
上面的例子你能夠猛戳這裏進行調試 調試
固然啦, 還有些構造函數多是咱們本身定義的,那麼他們也是同樣同樣的code
// 函數聲明 function Person() {} // 函數表達式 var Man = function() {} console.log(Person.__proto__ === Function.prototype) // true console.log(Man.__proto__ === Function.prototype) // true
這說明什麼呢?對象
全部的構造器都來自於Function.prototype,甚至包括根構造器Object及Function自身。全部構造器都繼承了Function.prototype的屬性及方法,如length、call、apply、bind(ES5)。blog
注意:Function.prototype自己是沒有這些屬性和方法的,他之因此能夠調用這些方法是由於Function.prototype是一個對象,既然是一個對象就好說了,那麼他的原型鏈指向的就會是Object.prototype了。
總的來講, 原型的因此知識點均可以用這麼一張圖來簡單歸納:
經過上面這張圖, 咱們能夠這樣理解:
.prototype是一個對象的原型對象,而.__proto__則是對原型對象的引用!