談談__proto__和prototype的區別

  我想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__則是對原型對象的引用!

相關文章
相關標籤/搜索