Javascript之 __proto__ 與 prototype

 

__proto__(隱式原型)與prototype(顯式原型)

  是什麼?

  • 顯式原型 explicit prototype property:

每個函數在建立以後都會擁有一個名爲prototype的屬性,這個屬性指向函數的原型對象。瀏覽器

  • 隱式原型 implicit prototype link:
JavaScript中任意對象都有一個內置屬性[[prototype]],在ES5以前沒有標準的方法訪問這個內置屬性,
可是大多數瀏覽器都支持經過__proto__來訪問。ES5中有了對於這個內置屬性標準的Get方法Object.getPrototypeOf().
  Object.prototype 這個對象是個例外,它的__proto__值爲null
  • 兩者的關係:

隱式原型指向建立這個對象的構造函數(constructor)的prototypeapp

  做用?

  • 顯式原型的做用:用來實現基於原型的繼承與屬性的共享。
  • 隱式原型的做用:構成原型鏈,一樣用於實現基於原型的繼承。舉個例子,當咱們訪問obj這個對象中的x屬性時,

   若是在obj中找不到,那麼就會沿着__proto__依次查找。函數


 

實例:spa

聲明構造函數A,給A的原型對象添加一個屬性和一個方法,prototype

用函數A建立一個對象a:code

1 A.prototype.name = "Jack"; 2 A.prototype.say = function () { 3     console.log("hello"); 4 }
6 function A() { 7     8 } 9 var a = new A( );

咱們來觀察一波控制檯的輸出。。。對象

 首先,對象a的__proto__(隱式原型)指向A的prototype(原型對象)blog

 而a.__proto__.__proto__又等價於下面那一大串東西,其實也等價於全部對象的祖先的原型對象——Object.prototype繼承

 而在原型鏈的定義中,Object.prototype即原型鏈的終點,再往上就沒有了。ip

 

 

 而構造函數A的prototype,也就是對象a的__proto__所指向的地方

 

* 構造函數A的__proto__又指向什麼?

 

 

    隱式原型指向構造該對象的構造函數的原型(A.__proto__ === A.constructor.prototype)。

由於function是特殊的對象,"Function.prototype",即全部函數的原型,一般函數均可以認爲是經過new Function製造出來的。

換句話說,Function.prototype上面承載了用於繼承給全部函數的那些屬性,例如:call、bind、apply等。


 

部份內容參考自:https://www.zhihu.com/question/34183746/answer/59043879

相關文章
相關標籤/搜索