用過JavaScript的同學們肯定都對prototype如雷貫耳,但是這究竟是個什麼東西卻讓初學者莫衷一是,只知道函數都會有一個prototype屬性,可以為其添加函數供實例訪問,其它的就不清楚了,最近看了一些JavaScript高階程式設計,終於揭開了其神秘面紗。
每個函數都有一個prototype屬性,這個屬性是指向一個對象的引用,這個對象稱為原型對象,原型對象包含函數實例共享的方法和屬性,也就是說將函數用作構造函數呼叫(使用new操作符呼叫)的時候,新建立的物件會從原型物件上繼承屬性和方法。
私有變數、函數
在具體說prototype前說幾個相關的東東,可以更好的理解prototype的設計意圖。之前寫的一篇JavaScript 命名空間文章中提到過JavaScript的函數作用域,在函數內定義的變數和函數如果不對外提供接口,那麼外部將無法訪問到,也就是變為私有變數和私有函數。
複製程式碼
靜態變數、函數
在物件導向程式設計中除了一些函式庫函數我們還是希望在物件定義的時候同時定義一些屬性和方法,實例化後可以訪問,JavaScript也能做到這樣
代碼如下:
var o1=new Obj();程式碼如下:
f 根據上圖可以看出Person對象會自動取得prototyp屬性,而prototype也是一個對象,會自動獲得一個constructor屬性,該屬性正是指向Person對象。程式碼如下:
Person的實例person1包含了name屬性,同時自動產生一個__proto__屬性,該屬性指向Person的prototype,可以存取到prototype內定義的printName方法,大概就是這個樣子的
寫段程式測試一下看看prototype內屬性、方法是能夠共享
複製程式碼
程式碼如下:
作者:色拉油