原型部念;我們先來看段簡單的函數(shù)
按照javascript的說法鹅士,function定義的這個Person就是一個Object(對象),而且還是一個很特殊的對象键兜,這個使用function定義的對象與使用new操作符生成的對象之間有一個重要的區(qū)別挚歧。這個區(qū)別就是function定義的對象有一個prototype屬性芒涡,使用new生成的對象就沒有這個prototype屬性,我們一般稱為普通對象物延!
我們需要理解記憶以下的邏輯順序:
Person是一個對象,它有一個prototype的原型屬性(因為所有的對象都一prototype原型=龈浮)prototype屬性有自己的prototype對象叛薯,而pototype對象肯定也有自己的constuct屬性,construct屬性有自己的constuctor對象笙纤,神奇的事情要發(fā)生了耗溜,這最后一個constructor對象就是我們構(gòu)造出來的function函數(shù)本身!
這張圖片只是證明了每一個對象函數(shù)都有一個原型對象而已
再來看看網(wǎng)上流傳最廣的一張描述幫助解釋原型的一張圖片
new去新的構(gòu)造一個實例的時候new出來的新實例之間屬性和方法是不能共享的妖异,它的優(yōu)點和缺點都是這一點。而當有多個實例的時候领追,我們把公共的屬性方法用prototype原型去創(chuàng)建他膳,把私有的屬性方法new去創(chuàng)建。
原型在設(shè)計之初就是用來解決js中繼承的問題的绒窑。js中沒有c++和java的類棕孙,js設(shè)計之初就是借鑒了java和c++中的new方法,去構(gòu)建新的實例回论,用prototype原型鏈去彌補new方法中的不足散罕。具體的一些信息建議參考阮一峰的。他的理解很有借鑒性傀蓉。
會不會很抽象欧漱?我認為挺抽象的。不過別急葬燎,我在搜索原型及原型鏈的時候看到一道對于我們理解原型很有幫助的一道題目误甚,理解了這道題目,原型什么的題目都不是事啦谱净。但是做題和理解又不一樣窑邦,這里我推薦阮一峰的關(guān)于原型的理解;http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html
現(xiàn)在我們來看題壕探。
待我和小伙伴們講完這題冈钦,相信大部分小伙伴就可以理解了
首先我們看Foo.getName();這個我們只需要在上述中尋找相應(yīng)的函數(shù)即可。很明顯李请,我們找到是2瞧筛;
getName();這個我們也可以直接找,找到的是4导盅;
Foo().getName();的意思是Foo()中的getName()方法较幌。。白翻。小伙伴們這樣就可以很快的找到答案了唉乍炉,答案就是1;
getName();這個為什么和上面的getNmae()不一樣了呢?var getName是定義了一個變量岛琼,當沒有調(diào)用Foo函數(shù)的時候底循,線程直接進行到4,而當Foo()調(diào)用的時候衷恭,getName變量在Foo()函數(shù)中輸出的是1此叠,整個線程的getName都變成了1,4被覆蓋了随珠。
new Foo.getName();其實有沒有new沒有影響灭袁,都是2,
最后兩個窗看,new Foo().getName();和new new Foo().getName();是構(gòu)造了兩個新的getName的對象茸歧,類似于prototype創(chuàng)建。多少個new是沒有關(guān)系的显沈,所以都是3.
抱歉软瞎,關(guān)于原型我試圖去講明白,但是網(wǎng)上講的很抽象拉讯,我理解的也抽象涤浇,實在闡述不清楚。如果有能闡述清楚的希望您能指點一二魔慷。