js是基於原型的語言(prototype-based language),基於原型是面向對象的一種流派。所謂原型就是自身相關屬性做爲模板爲新對象所使用,js有以原型爲核心的樹狀層級結構。原型和原型鏈也是深刻學習js的過程當中必須瞭解的知識點。javascript
先祟隨便寫一個函數java
var f=function(){}
console.log(f);
複製代碼
運行,發現它有一個prototype屬性: 編程
不只這個函數,全部的函數包括構造器Array、Fuction......都會有這個 prototype屬性,編程語言
prototype就是原型,每個函數都有prototype,prototype的值是一個對象。函數
仍是剛纔的例子,咱們會發現這個函數的prototype裏有一個constructor方法:學習
全部函數都有這個constructor方法,constructor方法指向這個函數自己。ui
仍是先整一段代碼,隨便搞一個對象spa
let a={
b:1,
c:2
}
console.log(a)
複製代碼
運行,發現它有一個__proto__屬性:prototype
值得一提的是,由於函數也是對象,因此函數既有prototype也有__proto__。code
當咱們在js中訪問某一個對象某個屬性時,會先在對象中尋找,若是找不到,就去原型對象上找,若是還找不到,就在原型對象的原型對象上找,以此類推,這樣就構成了人體蜈蚣(?什麼玩意)通常的原型鏈。原型鏈有點相似於繼承的感受。
舉個例子:
function F(){}
var f=new F;
console.info(f);
console.info(f.__proto__);
console.info(f.__proto__.__proto__);
console.info(f.__proto__.__proto__.__proto__);
複製代碼
運行結果:
這個例子能呈現一層又一層的原型鏈,可見原型鏈的頂層是null,所謂萬物皆虛是也(笑)。
由於js是基於原型的編程語言,因此不建議隨意更改構造器的prototype屬性,否則會影響到全部是由該構造器創造的元素。
這篇文是對原型和原型鏈的皮毛概述,是我學習過程當中的小小總結,但願有所幫助。