最近使用源生的js处理页面数据,所谓源生的就是指没有经过包装的、最基本的JavaScript代码;
像使用ext,jQuery...说成非源生的代码;自己做个轮子:一个简单的map;
在js里,对象是属性的集合,属性是合法的js标识符,属性名是String类型;
属性可以有值,也可以没值(undefined),属性的值可以是原始类型,也可以是对象;
js里,函数也是对象,值为函数的属性是对象的方法;
可以在运行时为对象添加属性,这也是动态语言的一个特点,这样的特点可以使代码很灵活,同样也可以让代码很难维护;
当创建一个函数时,系统/引擎会自动给它添加一个属性prototype,如:
此时,prototype指向一个对象,或prototype的值为一个对象,这也是默认的赋值;
使用prototype可以设计继承机构,我现在还没有足够的内功和口才叙述它,
片面的理解就是一句话:相同类型的对象具备此类型prototype的属性;
下面就看看我的map吧
像使用ext,jQuery...说成非源生的代码;自己做个轮子:一个简单的map;
在js里,对象是属性的集合,属性是合法的js标识符,属性名是String类型;
属性可以有值,也可以没值(undefined),属性的值可以是原始类型,也可以是对象;
js里,函数也是对象,值为函数的属性是对象的方法;
可以在运行时为对象添加属性,这也是动态语言的一个特点,这样的特点可以使代码很灵活,同样也可以让代码很难维护;
当创建一个函数时,系统/引擎会自动给它添加一个属性prototype,如:
Javascript代码
- 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 pin 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