HI

经过 2 年准备,7 个月写作,8 个月修改,《JavaScript 设计模式与开发实践》即将出版(5 月 20 号左右)。

预售地址将于 51 假期过后放出,感兴趣的同学可以关注。:)

封面

 

TAT.svenzeng 用 AOP 改善 javascript 代码
In Web开发 on 2013年08月12日 by view: 40,519
13

Aop 又叫面向切面编程,用过 spring 的同学肯定对它非常熟悉,而在 js 中,AOP 是一个被严重忽视的技术点,这篇就通过下面这几个小例子,来说说 AOP 在 js 中的妙用.

1, 防止 window.onload 被二次覆盖.
2,无侵入的统计代码.
3, 分离表单请求和校验.
4,给 ajax 请求动态添加参数.
5,职责链模式.
6, 组合代替继承.

TAT.svenzeng Javascript 中有趣的反柯里化技术
In JavaScript on 2013年08月12日 by view: 52,482
19

反柯里化 ( uncurrying, 非 currying ) 的话题来自 javascript 之父 Brendan Eich 去年的一段 twitter. 近几天研究了一下,觉得这个东东非常有意思,分享一下。先忘记它的名字,看下它能做什么.

不要小看这个功能,试想下,我们在写一个库的时候,时常会写这样的代码,拿 webQQ 的 Jx 库举例。

《parctical common lisp》的作者曾说,如果你需要一种模式,那一定是哪里出了问题。他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案。

不管是弱类型或强类型,静态或动态语言,命令式或说明式语言、每种语言都有天生的优缺点。一个牙买加运动员, 在短跑甚至拳击方面有一些优势,在练瑜伽上就欠缺一些。

享元模式主要用来减少程序所需的对象个数. 有一个例子, 我们这边的前端同学几乎人手一本《javascript 权威指南》. 从省钱的角度讲, 大约三本就够了. 放在部门的书柜里, 谁需要看的时候就去拿, 看完了还回去. 如果同时有 4 个同学需要看, 此时再去多买一本.
在 webqq 里面, 打开 QQ 好友列表往下拉的时候,会为每个好友创建一个 div( 如果算上 div 中的子节点, 还远不只 1 个元素 ).

职责链模式是一个对象 A 向另一个对象 B 发起请求,如果 B 不处理,可以把请求转给 C,如果 C 不处理,又可以把请求转给 D。一直到有一个对象愿意处理这个请求为止。

打个比方,客户让老板写个 php 程序。老板肯定不写,然后老板交给了部门经理。部门经理不愿意写,又交给项目经理。项目经理不会写,又交给程序员。最后由码农来完成。

备忘录模式在 js 中经常用于数据缓存. 比如一个分页控件, 从服务器获得某一页的数据后可以存入缓存。以后再翻回这一页的时候,可以直接使用缓存里的数据而无需再次请求服务器。
实现比较简单,伪代码:

组合模式又叫部分-整体模式,它将所有对象组合成树形结构。使得用户只需要操作最上层的接口,就可以对所有成员做相同的操作。
一个再好不过的例子就是 jquery 对象,大家都知道 1 个 jquery 对象其实是一组对象集合。比如在这样一个 HTML 页面

迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该方法中的内部表示。
js 中我们经常会封装一个 each 函数用来实现迭代器。
array 的迭代器: