__proto__和prototype

_proto_

每一個對象都有一個__proto__(先後各兩個下劃線)屬性來標識本身所繼承的原型對象。__proto__屬性對性能影響很是嚴重,不建議使用。git

prototype

只有函數纔有prototype屬性。當你建立函數時,JS會爲這個函數自動添加prototype屬性。構造函數原型的constructor默認指向自身。github

function Person(){
   this.name="aaa";
}
Person===Person.prototype.constructor // true
console.log(Person.prototype);// 結果見下圖

clipboard.png

Object和Function

每一個內置對象都是一個native object。一個內置的對象同時也是一個構造函數。function是一種對象類型。函數

Function

  1. function是內置Function的實例,即普通函數是Function的實例。所以普通函數的constructor是Function。Function的constructor仍是他本身。性能

    function Person(){var a=1;}
    Person.constructor    //function Function() { [native code] }
    
    Function     //function Function() { [native code] }
    Function.constructor   //function Function() { [native code] }
    Function===Function.constructor  //true
  2. 函數都有prototype屬性和__proto__ 屬性。函數的__proto__ 屬性均是function () { [native code] }。能夠這樣理解,function既是對象,又是函數。function做爲對象,有__proto__ 屬性,由於__proto__ 屬性指向構造函數的原型,而function是由Function建立的,所以普通函數.__proto__ =Function.prototype。this

    function Person(){var a=1;}
     Person.__proto__===Function.prototype   ///true
     Function.prototype //function () { [native code] }
  3. Function.prototype和Function.__proto__爲同一對象。這是因爲構造Function的是他本身,根據普通函數.__proto__ =Function.prototype,因此Function.__proto__ =Function.prototypespa

    Function.prototype  //function () { [native code] }
    Function.__proto__   // function () { [native code] }
    Function.prototype===Function.__proto__   //true
  4. Function.prototype的__proto__是Object.prototype。能夠這樣理解:Function.prototype也是一個原型對象,而普通對象的原型是Object.prototype,因此prototype

    Function.prototype.__proto__===Object.prototype //true

注意:使用 Function.prototype.bind創造的函數,沒有prototype屬性。code

Object

  1. Object.__proto__是Function.prototype。由於Object自己是個(構造)函數,是Function的實例。對象

    Object.__proto__      //function () { [native code] }
    Object.constructor    //function Function() { [native code] }
  2. 原型鏈的盡頭(root)是Object.prototype。全部對象均從Object.prototype繼承屬性。blog

    Object.prototype.__proto__   // null
  3. 某個對象.__proto__ =構造函數.prototype 。

    var a={};
    a.__proto__===Object.prototype //true
    a.__proto__ //結果見下圖

    clipboard.png

    普通對象是Object構造函數的實例,因此普通對象的原型是Object.prototype。

    function Person(){this.name="aa";}
     var b=new Person();
     b.__proto__===Person.prototype; //true
     b.__proto__ //結果見下圖

    clipboard.png

    上圖中b對象是Person構造函數的實例,因此b對象的原型是Person.prototype。

總結

1. Object和其它函數由Function產生,Function的constructor是他本身。

2. 一個對象一定有__proto__,而原型鏈的頂端是Object.prototype。

3. Object.prototype 是對象,可是不是經過Object函數建立的。由於Object.prototype.__proto__爲null。

4. Object的__proto__是Function.prototype,可是Function.prototype也是一個原型對象,所以Function.prototype.__proto__爲Object.prototype。

參考自:
從__proto__和prototype來深刻理解JS對象和原型鏈
Function

相關文章
相關標籤/搜索