看了不少ECMAScript,心血来潮写了个简单的模仿JAVA中HashMap的js对象,对泛型简单的实现
//用闭包模式把对象定义到Window上,避免属性名称的值被篡改
(function(win){
var HashMap = function(keyType,valueType){
this.length = 0 ;
this._keys = [];
this._values = [];
this.size = function(){
return this.length;
};
this.put = function(key,value){
if(!keyType && !valueType){ //对没有定义存储类型的Map
for(var i in this._keys){
if(this._keys[i] == key){
this._values[i] = value;
return;
}
}
this._keys.push(key);
this._values.push(value);
this.length++;
}else{ //定义了类型的 new HashMap("string",Object);
if(typeof(key) == keyType && (value instanceof valueType)){
for(var i in this._keys){
if(this._keys[i] == key){
this._values[i] = value;
return;
}
}
this._keys.push(key);
this._values.push(value);
this.length++;
}else{
alert("对象类型不符合");
}
}
};
this.get = function(key){
for(var i in this._keys){
if(this._keys[i] == key){
return this._values[i];
}
}
return null;
};
this.remove = function(key){
for(var i in this._keys){
if(this._keys[i] == key){
var temp = this._values[i];
//删除key
this._keys = this._keys.slice(0,i).concat(this._keys.slice(++i));
//删除key对应的value
this._values = this._keys.slice(0,--i).concat(this._keys.slice(++i));
this.length--;
return temp;
}
}
return null;
};
this.isEmpty = function(){
return this.length == 0;
};
this.clear = function(){
this.length = 0;
this._keys = [];
this._values = [];
};
this.putAllMap = function(map){
if(map instanceof HashMap){
this._keys.concat(map._keys);
this._values.concat(map._values);
this.length += map.length;
}else{
throw new Error("不为HashMap对象")
}
};
this.containsKey = function(key){
for(var i in this._keys){
if(this._keys[i] == key){
return true;
}
}
return false;
};
this.keysClone = function(){
var keys = [];
for(var i in this._keys){
keys.push(this._keys[i]);
}
return keys;
};
this.toString = function(){ //此方法要求存储对象实现了toString()方法
var data = "{";
for(var i in this._keys){
data += this._keys[i] +":" + this._values[i].toString() +",";
}
data = data.substring(0,data.length-1)+"}";
return data;
}
}
win.HashMap = HashMap;
})(window);
function Dog(name){
this.name = name;
this.toString = function(){
return this.name;
}
}
//使用
var map = new HashMap('string',Dog); //此map只存放 key为stirng类型,value是用new Dog("")生产的对象
map.put("杰克",new Dog("杰克"));
map.put("汤姆",new Dog("汤姆"));
map.put("大神",new Dog("大神"));
map.put("小仙",new Dog("小仙"));
alert(map.remove("大神").toString());
java中Map很多方法没实现,还需要补充。。。。待续
本文介绍了一个简单的JavaScript实现的HashMap对象,该对象模仿了Java中的HashMap,并支持泛型约束。通过闭包模式定义,确保了内部数据的安全性。文章提供了完整的源代码及示例。
296

被折叠的 条评论
为什么被折叠?



