轉載自:http://freejvm.iteye.com/blog/768025
最近使用源生的js處理頁面數據,所謂源生的就是指沒有經過包裝的、最基本的JavaScript代碼;
像使用ext,jQuery...說成非源生的代碼;自己做個輪子:一個簡單的map;
在js里,對象是屬性的集合,屬性是合法的js標識符,屬性名是String類型;
屬性可以有值,也可以沒值(undefined),屬性的值可以是原始類型,也可以是對象;
js里,函數也是對象,值為函數的屬性是對象的方法;
可以在運行時為對象添加屬性,這也是動態語言的一個特點,這樣的特點可以使代碼很靈活,同樣也可以讓代碼很難維護;
當創建一個函數時,系統/引擎會自動給它添加一個屬性prototype,如:
function Fn(){} alert(typeof Fn.prototype); //object
此時,prototype指向一個對象,或prototype的值為一個對象,這也是默認的賦值;
Fn.prototype=1; alert(typeof Fn.prototype); //number //這樣就修改了prototype的值,不過意義不大
使用prototype可以設計繼承機構,我現在還沒有足夠的內功和口才敘述它,
片面的理解就是一句話:相同類型的對象具備此類型prototype的屬性;
下面就看看我的map吧
function getMap(){//初始化map_,給map_對象增加方法,使map_像個Map var map_=new Object(); //屬性加個特殊字符,以區別方法名,統一加下划線_ map_.put=function(key,value){ map_[key]=value;} map_.get=function(key){ return map_[key];} map_.remove=function(key){ delete map_[key];} map_.keyset=function(){ var ret=""; for(var p in map_){ if(typeof p =='string' && p.substring(p.length-1)=="_"){ ret+=","; ret+=p; } } if(ret==""){ return ret.split(","); //empty array }else{ return ret.substring(1).split(","); } } return map_; } var map_=getMap(); map_.put('id_',"001"); map_.put('name_',"anna"); alert(map_.keyset()); //id_,name_ var keys=map_.keyset(); for(var i=0;i<keys.length;i++){ alert(map_.get(keys[i])); //001,then anna } map_.put("course_",new Array()); map_.get("course_").push("Math"); map_.get("course_").push("English"); map_.get("course_").push("Physics"); alert(map_.get("course_")); //Math,English,Physics
可以在此map_的基礎之上構建復雜點的數據結構,如:樹狀結構;
js學習中...想看一些關於js優化、內存管理的書籍,了解的同仁可以推薦一下,OTZ