我理解使用元素存储一些数据的想法,但作为Javascript学习者,我很好奇使用此方法存储的数据实际上是什么。
mootools帮助页面非常简单,对我没有帮助。
有人能告诉我在哪里可以找到更全面的mootools吗?
答案 0 :(得分:4)
存储实际工作的方式很简单。
在定义方法的闭包中,每个元素都有一个私有{object}
用作字典。该闭包的任何方法都可以访问存储对象,但它不能直接从外部穿孔。
在工作代码中:
(function(){
// private shared object
var Storage = {};
/**
* @param {string} key
* @param {*} value
* @return {HTMLElement}
*/
Element.implement('write', function(key, value){
// Slick can get a unique id for every element. this is key in storage
var uid = Slick.uidOf(this),
s = Storage[uid] || (Storage[uid] = {});
return (s[key] = value), this;
});
/**
* @param {string} key
* @param {*=} initial value, optional
* @return {*}
*/
Element.implement('read', function(key, initial){
var uid = Slick.uidOf(this),
s = Storage[uid] || (Storage[uid] = {}),
undef = 'undefined';
typeof initial !== undef && typeof s[key] === undef && (s[key] = initial);
return s[key];
});
}());
var foo = document.id('foo');
foo.write('hello', 'there'); // save
console.log(foo.read('hello')); // read
console.log(foo.read('foo', 'bar')); // via initial value api, bar.
这几乎是完整的读/写api - 唯一缺少的是.eliminate
功能 - 请记住它比实际代码稍微更具防御性,这是用perf编写的记住所以它没有那么多。
http://jsfiddle.net/aj0pccew/2/
更多信息:
为什么它以这种方式而不是作为属性的元素,它更快:只需要元素本身的1个属性(uid
),不需要DOM访问读/写东西,避免通过元素和循环引用泄漏。它还可以通过删除以前在destroy
API存储中存储数据的元素来创建泄漏。