資源描述:
《javascript原型繼承工作原理和實(shí)例詳解_javascript技巧》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、javascript原型繼承工作原理和實(shí)例詳解先為大家分享JS原型繼承實(shí)例,供大家參考,具體內(nèi)容如下一、JS原型繼承JS原型繼承//cloneO函數(shù)用來創(chuàng)建新的類Person對象varclone二function(obj){var_f=function(){};//這旨是原型式繼承最核心的地方,函數(shù)的原型對象為對象字而量_f.prototype=obj;retur
2、nnew_f;}"〃先聲明一個(gè)對彖字而量varAnimal={somthing:'apple,,eat:function(){consolc.1og(〃C3t"+this?somthing);}}〃不需要定義一個(gè)Person的子類,只要執(zhí)行一次克隆即可varCat二clone(Animal);//可以直接獲得Person提供的默認(rèn)值,也可以添加或者修改屈性和方法console,log(Cat?eat());Cat?somthing='orange,;console,log(Cat.eat());〃聲明了類,執(zhí)行一次克隆即可varSomeone=clone(Cat);
3、y>二、JavaScript原型繼承工作原理JavaScript采用原型繼承這事兒是眾所皆知的,但由于它默認(rèn)只提供了一個(gè)實(shí)現(xiàn)的實(shí)例,也就是new運(yùn)算符,因此對于它的解釋總是令人困惑,接下來闡明什么是原型繼承以及在JavaScript中究竟如何使用原型繼承。原型繼承的定義當(dāng)你閱讀關(guān)于JS原型繼承的解釋時(shí),你時(shí)常會看到以下這段文字:當(dāng)杳找一個(gè)對象的屈性時(shí),JaveiScEpt會向上遍歷原型鏈,直到找到給定名稱的屈性為止。岀iJavaScript秘密花園大多數(shù)JavaScript的實(shí)現(xiàn)用—proto_屬性來表示一個(gè)對彖的原型鏈。在這篇文章里我們將看到—proto_與prototype的區(qū)別何在。注:
4、_proto_是一個(gè)不應(yīng)在你代碼中出現(xiàn)的非正規(guī)的用法,這里僅僅用它來解釋JavaScript原型繼承的工作原理。以下代碼展示了JS引擎如何查找屬性:functiongetProperty(obj,prop){if(obj.hasOwnProperty(prop))returnobj[prop]elseif(obj?_proto—!==null)returngetProperty(obj._proto_,prop)elsereturnundefined}讓我們舉一個(gè)常見的例子:二維點(diǎn),擁有二維坐標(biāo)Xy,同似擁有一個(gè)print方法。用Z前我們說過的原型繼承的定義,我們創(chuàng)建一個(gè)對象Point,擁有三
5、個(gè)屬性:x,y和printo為了能創(chuàng)建一個(gè)新的二維點(diǎn),我們需要創(chuàng)建一個(gè)新的對象,讓他其中的—proto—屬性指向Point:varPoint={x:0,y:o,console,log(this,x,this,y);}print:function()varp={x:10,y:20,―proto_:Point};p.print();//1020JavaScript怪異的原型繼承令人困惑的是,每個(gè)教授原型繼承的人都不會給出這樣一段代碼,反而會給出下面這樣的代碼:functionPoint(x,y){this,x二x;this,y二y;1jPoint.prototype={print:function
6、(){console.log(this.x,this,y);}};varp=newPoint(10,20);p.print();//1020這和說好的不一樣啊,這里Point變成了函數(shù),然后還有個(gè)什么prototype的屬性,而且有了new運(yùn)算符。這他卩苗的是什么情況?new運(yùn)算符是如何工作的造物者BrendanEich想讓JS和傳統(tǒng)的血向?qū)ο蟮木幊陶Z言差不太多,如Java和C++。在這些語言里,我們采用new運(yùn)算符來給類實(shí)例化一個(gè)新的對象。所以他在JS里寫了一個(gè)new運(yùn)算符。C++里有用來初始化實(shí)例屬性的構(gòu)造函數(shù)概念,因此new運(yùn)算符必須針對函數(shù)。我們需要將對象的方法放到一個(gè)地方去,既然我們
7、在用原型語言,我們就把它放到函數(shù)的原型屈性小去。new運(yùn)算符接受一個(gè)函數(shù)F及其參數(shù):newF(arguments...)o這一過程分為三步:創(chuàng)建類的實(shí)例。這步是把-個(gè)空的對象的_proto_屬性設(shè)置為F.prototype。初始化實(shí)例。函數(shù)F被傳入?yún)?shù)并調(diào)用,關(guān)鍵字this被設(shè)定為該實(shí)例。返回實(shí)例?,F(xiàn)在我們知道了new是怎么工作的,我們可以用JS代碼實(shí)現(xiàn)一下:functionNew(f){varn