構造函數的Prototype上定義的方法确實可以通過對象直接調用,而且代碼是共享的。我表示我不懂。太難了解了,艹。
在Javascript中,prototype不但能讓對象共享自己的财富,而且prototype還有尋根問祖的天性。
當從一個對象那裡讀取屬性或調用方法時,如果該對象自身不存在這樣的屬性或方法,就會去自己關聯的prototype對象裡尋找。如果prototype沒有,
又會去prototype自己關聯的前輩prototype那裡尋找,直到找到或追溯過程結束為止。
我們先從Javascript中的構造函數說起,


這裡的Employee繼承了Person,包括屬性設定和方法。但是這裡的SayHello方法卻不是一個方法,而是在Employee中新開辟的一個方法。相當于複制過來的方法。
而是用prototype就不是這樣了。prototype可以讓Employee共享Person的原型方法。
如果Person建立兩個對象,那麼它們調用同一個方法嗎?
我們來看代碼:


結果發現,是的,它們的确調用一個方法。而不是像Employee那麼複制出的新方法。
上述代碼轉化成原型模式,也很簡單,如下所示,先設定屬性,再通過原型定義方法:


"原型繼承"是慈祥而又嚴厲的。原型對象将自己的屬性和方法無私地貢獻給孩子們使用,也并不強迫孩子們必須遵從,允許一些頑皮孩子按自己的興趣和愛好獨立行事。
我們來進一步研究原型prototype的特點,


這裡原型中的屬性和方法可以被覆寫掉。但原型自身的并沒有受到影響。
對象可以掩蓋原型對象的那些屬性和方法,一個構造函數原型對象也可以掩蓋上層構造函數原型對象既有的屬性和方法。
我們可以随時給原型對象動态添加新的屬性和方法,進而動态擴充基類的功能特性。我們來看下面的代碼:


這裡後續動态添加的方法,之前的對象已然可以使用,就是這麼神奇。
最後我們用一個稍微複雜的例子來說明原型的使用:


這裡的兩個SayHello是同一個方法哦,也就是調用同一個方法産生的哦,跟之前的Employee複制過來的有差別哦。這點,讀着可以細細體會其中的奧秘。
總之,原型prototype可以共享方法,"原型繼承"是慈祥而又嚴厲的。原型對象将自己的屬性和方法無私地貢獻給孩子們使用,也并不強迫孩子們必須遵從,允許一些頑皮孩子按自己的興趣和愛好獨立行事。
本文轉自TBHacker部落格園部落格,原文連結:http://www.cnblogs.com/jiqing9006/p/3154734.html,如需轉載請自行聯系原作者