資源描述:
《淺談javascript的原型繼承》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、javascript的繼承在很多框架中都有運(yùn)用,尤其是原型式繼承。首先要理解一個概念,什么是原型式繼承?所謂的原型式繼承,就是在函數(shù)內(nèi)部先創(chuàng)建一個臨時性的構(gòu)造函數(shù),然后將傳入的對象做這個構(gòu)造函數(shù)的原型,最后返回這個臨時類型的新實(shí)例請看源碼:復(fù)制代碼代碼如下:functionclone(o){varF=function(){};F.prototype=o;returnnewF();}首先看ext(4.1的1896行開始)的原型式繼承。復(fù)制代碼代碼如下:varTemplateClass=function(){};va
2、rExtObject=Ext.Object={chain:function(object){TemplateClass.prototype=object;varresult=newTemplateClass();TemplateClass.prototype=null;returnresult;}}這里清除了object的prototype。再看一下jquery是怎么玩的繼承。復(fù)制代碼代碼如下:varjQuery=function(selector,context){returnnewjQuery.fn.init
3、(selector,context,rootjQuery);};-----------------------jQuery.fn=jQuery.prototype={constructor:jQuery,init:function(selector,context,rootjQuery){-----------------------}}-------------------jQuery.fn.init.prototype=jQuery.fn;jquery玩的就比較高,借助jQuery.fn.init來完成,但是
4、思路一樣。司徒正美的mass里也有類似的繼承,在lang_fix.js里面第17行:復(fù)制代碼代碼如下:create:function(o){if(arguments.length>1){$.log("Object.createimplementationonlyacceptsthefirstparameter.")}functionF(){}F.prototype=o;returnnewF();}查看了一下es5的官方,找到了他的兼容補(bǔ)?。簭?fù)制代碼代碼如下://ES515.2.3.5//http://es5.gi
5、thub.com/#x15.2.3.5if(!Object.create){Object.create=functioncreate(prototype,properties){varobject;if(prototype===null){object={"__proto__":null};}else{if(typeofprototype!="object"){thrownewTypeError("typeofprototype["+(typeofprototype)+"]!='object'");}varTyp
6、e=function(){};Type.prototype=prototype;object=newType();//IEhasnobuilt-inimplementationof`Object.getPrototypeOf`//neither`__proto__`,butthismanuallysetting`__proto__`will//guaranteethat`Object.getPrototypeOf`willworkasexpectedwith//objectscreatedusing`Object
7、.create`object.__proto__=prototype;}if(properties!==void0){Object.defineProperties(object,properties);}returnobject;};}上面的代碼考慮的就比較全面,但是需要另外引入Object.defineProperties的補(bǔ)丁才行,源碼相對就比較多了。復(fù)制代碼代碼如下://ES515.2.3.6//http://es5.github.com/#x15.2.3.6//PatchforWebKitandIE8s
8、tandardmode//Designedbyhax//relatedissue:https://github.com/kriskowal/es5-shim/issues#issue/5//IE8Reference://http://msdn.microsoft.com/en-us/library/dd282900.aspx//http:/