Prototype Hash对象 学习


Posted in Javascript onJuly 19, 2009
//Hash对象的工具函数 
function $H(object) { 
return new Hash(object); 
}; var Hash = Class.create(Enumerable, (function() { 
//初始化,创建一个新的Hash对象 
function initialize(object) { 
this._object = Object.isHash(object) ? object.toObject() : Object.clone(object); 
} 
//覆盖Enumerable里面的方法,遍历Hash对象时会用到 
function _each(iterator) { 
for (var key in this._object) { 
var value = this._object[key], pair = [key, value]; 
pair.key = key; 
pair.value = value; 
iterator(pair); 
} 
} 
function set(key, value) { 
return this._object[key] = value; 
} 
function get(key) { 
if (this._object[key] !== Object.prototype[key]) 
return this._object[key]; 
} 
function unset(key) { 
var value = this._object[key]; 
delete this._object[key]; 
return value; 
} 
function toObject() { 
return Object.clone(this._object); 
} 
function keys() { 
return this.pluck('key'); 
} 
function values() { 
return this.pluck('value'); 
} 
//返回value的key 
function index(value) { 
var match = this.detect(function(pair) { 
return pair.value === value; 
}); 
return match && match.key; 
} 
function merge(object) { 
return this.clone().update(object); 
} 
//更新原有Hash对象,把object参数内的键值对更新到原Hash对象 
function update(object) { 
return new Hash(object).inject(this, function(result, pair) { 
result.set(pair.key, pair.value); 
return result; 
}); 
} 
function toQueryPair(key, value) { 
if (Object.isUndefined(value)) return key; 
return key + '=' + encodeURIComponent(String.interpret(value)); 
} 
function toQueryString() { 
return this.inject([], function(results, pair) { 
var key = encodeURIComponent(pair.key), values = pair.value; 
if (values && typeof values == 'object') { 
if (Object.isArray(values)) 
return results.concat(values.map(toQueryPair.curry(key))); 
} else results.push(toQueryPair(key, values)); 
return results; 
}).join('&'); 
} 
function inspect() { 
return '#<Hash:{' + this.map(function(pair) { 
return pair.map(Object.inspect).join(': '); 
}).join(', ') + '}>'; 
} 
function toJSON() { 
return Object.toJSON(this.toObject()); 
} 
function clone() { 
return new Hash(this); 
} 
return { 
initialize: initialize, 
_each: _each, 
set: set, 
get: get, 
unset: unset, 
toObject: toObject, 
toTemplateReplacements: toObject, 
keys: keys, 
values: values, 
index: index, 
merge: merge, 
update: update, 
toQueryString: toQueryString, 
inspect: inspect, 
toJSON: toJSON, 
clone: clone 
}; 
})()); 
Hash.from = $H;

clone
each
get
inspect
keys
merge
remove
set
toJSON
toObject
toQueryString
unset
update
value
给出一些方法的示例,简单的方法就略过了
toQueryString():
$H({ action: 'ship', order_id: 123, fees: ['f1', 'f2'], 'label': 'a demo' }).toQueryString() 
// -> 'action=ship&order_id=123&fees=f1&fees=f2&label=a%20demo' // an empty hash is an empty query string: 
$H().toQueryString() 
// -> ''

update():
var h = $H({ name: 'Prototype', version: 1.5 }); 
h.update({ version: 1.6, author: 'Sam' }).inspect(); 
// -> #<Hash:{'name': 'Prototype', 'version': 1.6, 'author': 'Sam'}> h.inspect(); 
// -> #<Hash:{'name': 'Prototype', 'version': 1.6, 'author': 'Sam'}> 
//注意这里会改变原来的Hash对象

merge():
var h = $H({ name: 'Prototype', version: 1.5 }); 
h.merge({ version: 1.6, author: 'Sam' }).inspect(); 
// -> #<Hash:{'name': 'Prototype', 'version': 1.6, 'author': 'Sam'}> h.inspect(); 
// -> #<Hash:{'name': 'Prototype', 'version': 1.5}> 
//注意这里不改变原有Hash对象
Javascript 相关文章推荐
一个收集图片的bookmarlet(js 刷新页面中的图片)
May 27 Javascript
基于jquery的让textarea自适应高度的插件
Aug 03 Javascript
jQuery插件原来如此简单 jQuery插件的机制及实战
Feb 07 Javascript
时间戳转换为时间 年月日时间的JS函数
Aug 19 Javascript
js面向对象编程之如何实现方法重载
Jul 02 Javascript
举例详解AngularJS中ngShow和ngHide的使用方法
Jun 19 Javascript
纯javascript实现图片延时加载方法
Aug 21 Javascript
javascript实现网页中涉及的简易运动(改变宽高、透明度、位置)
Nov 29 Javascript
详解Javascript中的原型OOP
Oct 12 Javascript
简单实现js上传文件功能
Aug 21 Javascript
详解写好JS条件语句的5条守则
Feb 28 Javascript
JS实现随机抽取三人
Nov 06 Javascript
Prototype Array对象 学习
Jul 19 #Javascript
Prototype PeriodicalExecuter对象 学习
Jul 19 #Javascript
Prototype String对象 学习
Jul 19 #Javascript
Prototype Template对象 学习
Jul 19 #Javascript
Prototype Number对象 学习
Jul 19 #Javascript
Prototype ObjectRange对象学习
Jul 19 #Javascript
Prototype RegExp对象 学习
Jul 19 #Javascript
You might like
用PHP的超级变量$_POST获取HTML表单(HTML Form) 数据
2011/05/07 PHP
html读出文本文件内容
2007/01/22 Javascript
又一个小巧的图片预加载类
2007/05/05 Javascript
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
js身份证判断方法支持15位和18位
2014/03/18 Javascript
js仿土豆网带缩略图的焦点图片切换效果实现方法
2015/02/23 Javascript
nodejs实现遍历文件夹并统计文件大小
2015/05/28 NodeJs
angular.bind使用心得
2015/10/26 Javascript
小白谈谈对JS原型链的理解
2016/05/03 Javascript
AngularJS 整理一些优化的小技巧
2016/08/18 Javascript
jQuery简单实现遍历单选框的方法
2017/03/06 Javascript
微信小程序实现全国机场索引列表
2018/01/31 Javascript
JS 实现缓存算法的示例(FIFO/LRU)
2018/03/20 Javascript
详解Vue-axios 设置请求头问题
2018/12/06 Javascript
React中使用外部样式的3种方式(小结)
2019/05/28 Javascript
JavaScript如何把两个数组对象合并过程解析
2019/10/10 Javascript
layui清除radio的选中状态实例
2019/11/14 Javascript
element-ui如何防止重复提交的方法步骤
2019/12/09 Javascript
[49:35]LGD vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
Python守护进程(daemon)代码实例
2015/03/06 Python
详解Python中的__new__、__init__、__call__三个特殊方法
2016/06/02 Python
django静态文件加载的方法
2018/05/20 Python
Python BS4库的安装与使用详解
2018/08/08 Python
Python类装饰器实现方法详解
2018/12/21 Python
Python考拉兹猜想输出序列代码实践
2019/07/05 Python
Python sorted对list和dict排序
2020/06/09 Python
CSS3实战第一波 让我们尽情的圆角吧
2010/08/27 HTML / CSS
纯HTML5+CSS3制作生日蛋糕代码
2016/11/16 HTML / CSS
canvas进阶之贝塞尔公式推导与物体跟随复杂曲线的轨迹运动
2018/01/10 HTML / CSS
美国购买隐形眼镜网站:Lenses For Less
2020/07/05 全球购物
仪器仪表检测毕业生自荐信
2013/10/31 职场文书
结婚周年感言
2014/02/24 职场文书
再婚婚前财产协议书范本
2014/10/19 职场文书
Nginx下配置Https证书详细过程
2021/04/01 Servers
mysql 如何获取两个集合的交集/差集/并集
2021/06/08 MySQL
关于MySQL中的 like操作符详情
2021/11/17 MySQL