该代码注释齐全,摘自JavaScript:TDG,个人觉得非常有参考价值,体现了很好的OOP思想,也已经加工后运用在实际项目中。
/**
*运用JavaScript进行模拟Java中的Set无序,无重复集合**/
//定义构造函数
function Set(){
this.values = {};//用来存在键值对形式的空对象
this.n = 0; //存在计算所存放的值的数量
this.add.apply(this, arguments);//调用add方法,进行数据添加,其定义放在后面
}
//定义添加值的方法
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)){
this.values[str] = val; //不存在这样的值,进行存储
this.n ++;
}
}
return this; //支持函数链操作,这里的this指向Set实例的本身
};
//定义删除值的方法
Set.prototype.remove = function(){
for (var i = 0; i < arguments.length; i++) {//遍历每个参数
var val = arguments[i];//获取需要删除的值
var str = Set._v2s(val);//按照约定,将值转化为字符串,作为键来使用
if(this.values.hasOwnProperty(str)){
delete this.values[str]; //如果存在这样的值,进行删除
this.n --;
}
}
return this; //支持函数链操作,这里的this指向Set实例的本身
};
//定义获取该集合是否包含某个值的方法
Set.prototype.contains = function(value){
return this.values.hasOwnProperty(Set._v2s(value));
};
//定义返回集合尺寸的方法
Set.prototype.size = function(){
return this.n;
};
//定义遍历集合,并在指定的上下文环境中调用函数f, context指定调用的上下文环境
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); //对象形式
}
//定义对值对象进行获取唯一标识符的方法
function objectId(o){
var prop = "|**objectId**|";
if(!o.hasOwnProperty(prop)){
o[prop] = Set._v2s.next ++;
}
return o[prop];
}
}
};
Set._v2s.next = 100;