var myImage = (function () { var imgNode = document.createElement('img'); document.body.appendChild(imgNode); return { setSrc: function (src) { imgNode.src = src; } } })();
proxyImage 负责预加载图片,并在预加载完成之后把请求交给本体 myImage:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
var proxyImage = (function () { var img = newImage; img.onload = function () { myImage.setSrc(this.src); }; return { setSrc: function (src) { myImage.setSrc('xxx.gif'); img.src = src; } }; })();
proxyImage.setSrc('abc.jpg');
18.1.2 迭代器模式
有一段这样的代码,先遍历一个集合,然后往页面中添加一些 div,这些 div 的 innerHTML 分别对应一个集合里的元素:
1 2 3 4 5 6 7 8 9
var appendDiv = function (data) { for (var i = 0, l = data.length; i < l; i++) { var div = document.createElement('div'); div.innerHTML = data[i]; document.body.appendChild(div); } };
appendDiv([1, 2, 3, 4, 5, 6]);
appendDiv 函数承担了遍历聚合对象和渲染数据的职责,有必要把遍历 data 的职责提取出来,这正是迭代器模式的意义,迭代器模式提供了一种方法来访问聚合对象,而不用暴露这个对象的内部表示。
当把迭代聚合对象的职责单独封装在 each 函数中后,即使以后还要增加新的迭代方式,我们只需要修改 each 函数即可,appendDiv 函数不会受到牵连:
var each = function (obj, callback) { var value, i = 0, length = obj.length, isArray = isArrayLike(obj); // isArrayLike 函数此处未实现,仅作示意
if (isArray) { // 迭代 object 对象 for (; i < length; i++) { callback.call(obj[i], i, obj[i]); } } else { for (i in obj) { // 迭代 object 对象 value = callback.call(obj[i], i, obj[i]); } }
return obj; };
var appendDiv = function (data) { each(data, function (i, n) { var div = document.createElement('div'); div.innerHTML = n; document.body.appendChild(div); }); };