原型;我們先來看段簡(jiǎn)單的函數(shù)

按照javascript的說法,function定義的這個(gè)Person就是一個(gè)Object(對(duì)象),而且還是一個(gè)很特殊的對(duì)象,這個(gè)使用function定義的對(duì)象與使用new操作符生成的對(duì)象之間有一個(gè)重要的區(qū)別。這個(gè)區(qū)別就是function定義的對(duì)象有一個(gè)prototype屬性,使用new生成的對(duì)象就沒有這個(gè)prototype屬性,我們一般稱為普通對(duì)象!
我們需要理解記憶以下的邏輯順序:
Person是一個(gè)對(duì)象,它有一個(gè)prototype的原型屬性(因?yàn)樗械膶?duì)象都一prototype原型?。﹑rototype屬性有自己的prototype對(duì)象,而pototype對(duì)象肯定也有自己的constuct屬性,construct屬性有自己的constuctor對(duì)象,神奇的事情要發(fā)生了,這最后一個(gè)constructor對(duì)象就是我們構(gòu)造出來的function函數(shù)本身!

這張圖片只是證明了每一個(gè)對(duì)象函數(shù)都有一個(gè)原型對(duì)象而已
再來看看網(wǎng)上流傳最廣的一張描述幫助解釋原型的一張圖片

new去新的構(gòu)造一個(gè)實(shí)例的時(shí)候new出來的新實(shí)例之間屬性和方法是不能共享的,它的優(yōu)點(diǎn)和缺點(diǎn)都是這一點(diǎn)。而當(dāng)有多個(gè)實(shí)例的時(shí)候,我們把公共的屬性方法用prototype原型去創(chuàng)建,把私有的屬性方法new去創(chuàng)建。
原型在設(shè)計(jì)之初就是用來解決js中繼承的問題的。js中沒有c++和java的類,js設(shè)計(jì)之初就是借鑒了java和c++中的new方法,去構(gòu)建新的實(shí)例,用prototype原型鏈去彌補(bǔ)new方法中的不足。具體的一些信息建議參考阮一峰的。他的理解很有借鑒性。
會(huì)不會(huì)很抽象?我認(rèn)為挺抽象的。不過別急,我在搜索原型及原型鏈的時(shí)候看到一道對(duì)于我們理解原型很有幫助的一道題目,理解了這道題目,原型什么的題目都不是事啦。但是做題和理解又不一樣,這里我推薦阮一峰的關(guān)于原型的理解;http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html
現(xiàn)在我們來看題。

待我和小伙伴們講完這題,相信大部分小伙伴就可以理解了
首先我們看Foo.getName();這個(gè)我們只需要在上述中尋找相應(yīng)的函數(shù)即可。很明顯,我們找到是2;
getName();這個(gè)我們也可以直接找,找到的是4;
Foo().getName();的意思是Foo()中的getName()方法。。。小伙伴們這樣就可以很快的找到答案了唉,答案就是1;
getName();這個(gè)為什么和上面的getNmae()不一樣了呢?var getName是定義了一個(gè)變量,當(dāng)沒有調(diào)用Foo函數(shù)的時(shí)候,線程直接進(jìn)行到4,而當(dāng)Foo()調(diào)用的時(shí)候,getName變量在Foo()函數(shù)中輸出的是1,整個(gè)線程的getName都變成了1,4被覆蓋了。
new Foo.getName();其實(shí)有沒有new沒有影響,都是2,
最后兩個(gè),new Foo().getName();和new new Foo().getName();是構(gòu)造了兩個(gè)新的getName的對(duì)象,類似于prototype創(chuàng)建。多少個(gè)new是沒有關(guān)系的,所以都是3.
抱歉,關(guān)于原型我試圖去講明白,但是網(wǎng)上講的很抽象,我理解的也抽象,實(shí)在闡述不清楚。如果有能闡述清楚的希望您能指點(diǎn)一二。