【js学习笔记-052】js中的面向对象技术------集合类

来源:互联网 发布:幸运抽奖软件 编辑:程序博客网 时间:2024/06/05 06:42

集合类

它是一种数据类型,用以表示非重复值的无序集合。

它的基础方法包括添加值,检测值是否在集合中,这种集合需要一个通用的实现,以保证操作效率。以下实例实现了从javascript值到唯一字符串的映射,然后将这个字符串用做属性。

对象和函数都不具备如此简明可靠的唯一字符串表示。因此集合中的每一个对象或函数都要定义一个唯一的属性标识。

 

function Set(){

  this.values = {}; //集合对象保存在对象的属性里

  this.n = 0; //集合中对象的个数

  this.prototype.add.apply(this,arguments);

}

 

Set.prototype.add = function(){

 for(var i=0;i<arguments.length;i++){

  var val = arguments[i];

  var str = Set._v2s(val); //将参数转换为字符串

  if(!this.values.hasOwnProperty(str)){//集合的值集中没这个key则添加key及key对应的值

    this.values[str] = val;

   this.n++

   }

  }

  return this; //支持链式方法调用

}

 

Set.prototype.remove = function(){

   var  val = arguments[i];

  var   str = Set._v2s(val); //将参数转换为字符串

  if(this.values.hasOwnProperty(str)==true){ //集合的值集中没这个key则添加key及key对应的值

    delete this.values[str];

   this.n--;

   }

  }

  return this; //支持链式方法调用 

}

 

 

Set.prototype.contains = function(value){

   return  this.values.hasOwnProperty(Set._v2s(value));

}

Set.prototype.size = function(){

  return this.n;

}

 

//遍历集合中的所有元素,在指定的上下文中调用f

Set.prototype.foreach = function(f,context){

   for(var  s in this.values){

   if(this.values.hasOwnProperty(s)){

      f.call(context,this.values[s]);

    }

  }

}

 

Set._v2s = function(val){

  switch(val){

     case  undefined: return 'u';

     case  null: return 'n';

     case  true: return 't';

     case false: return 'f';

    default: switch(typeof val){

            case  'number':return '#'+val;

            case  'string':return   '"'+val;

            default:return '@'+objectId(val); //objfunc

     }

   }

  //object 时返回的

   //不同对象返回不同字符串,同一对象总是返回相同字符

   function objectId(o){

      var prop = "|**objectid**|";

      if(!o.hasOwnProperty(prop)){

        o[prop] = Set._v2s.next++;

      }

      return o[prop]; //返回这个id

   }

 

}

 

Set._v2s.next=100; //设置id从100开始

原创粉丝点击