最近有些朋友一直問起prototye是什么,偶一直不怎么做javascript開發(fā),只能簡(jiǎn)單說說自己的理解。
javascript其實(shí)不是嚴(yán)格意義的OO語(yǔ)言,至少他沒有很好地實(shí)現(xiàn)封裝和繼承,甚至javascript使用的是function式對(duì)象。
因此,javascript有一個(gè)奇怪的東西就是prototype,javascript中約定了每個(gè)對(duì)象都可以包含一個(gè)prototype對(duì)象的引用(屬性),
這個(gè)prototype對(duì)象在運(yùn)行時(shí)是不可見的,也就是說,定義了之后,你無法直接使用prototype對(duì)象。
那么,prototype對(duì)象有什么用呢?它的作用,就是當(dāng)你去調(diào)用一個(gè)對(duì)象的函數(shù)或?qū)傩詴r(shí),javascript首先會(huì)在這個(gè)對(duì)象的定義中查找,如果找不到,
他就會(huì)去找這個(gè)對(duì)象的prototype對(duì)象有沒有這個(gè)定義,如果還找不到,他又會(huì)去找prototype對(duì)象的prototype,一直到對(duì)象沒有prototype定義為止。
是不是和函數(shù)繼承的目的很象?這就是javascript的原型繼承特性。
但是我們也看出了,這種查找方式,效率非常之低,尤其在prototype鏈很長(zhǎng)的情況下。javascript 2.0會(huì)對(duì)此有所改進(jìn)。
另外,prototype的定義方式也很奇怪,他必須以一個(gè)對(duì)象實(shí)例(而不是類)的形式,綁定到其他類上。記得嗎?prototype是定義時(shí)的,同時(shí)又是對(duì)象。
例子:
?? ?o1 = function(){};
?? ?o2 = function(){};
??? o2.prototype = new o1;??
如果嫌直接使用prototype挺麻煩,你可以去下載一個(gè)prototype.js來用,這個(gè)封裝真的挺不錯(cuò):)