- 1、本文档共33页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
常用的Javascript 设计模式
2013/04/02 | 分类: Web 前端, 开发 | 7 条评论 | 标签: Javascript,
Web 前端, 设计模式
分享到: 62
原文出处: alloyteam 博客-svenzeng 欢迎加入Web 前端开发小组。
《Practical Common Lisp》的作者 Peter Seibel 曾说,如果你需要一种模
式,那一定是哪里出了问题。他所说的问题是指因为语言的天生缺陷,不得不
去寻求和总结一种通用的解决方案。
不管是弱类型或强类型,静态或动态语言,命令式或说明式语言、每种语言都
有天生的优缺点。一个牙买加运动员, 在短跑甚至拳击方面有一些优势,在练
瑜伽上就欠缺一些。
术士和暗影牧师很容易成为一个出色的辅助,而一个背着梅肯满地图飞的敌法
就会略显尴尬。 换到程序中, 静态语言里可能需要花很多功夫来实现装饰者,
而js 由于能随时往对象上面扔方法,以至于装饰者模式在js 里成了鸡肋。
讲 Javascript 设计模式的书还比较少,《Pro javaScript Design
Patterns》是比较经典的一本,但是它里面的例子举得比较啰嗦,所以结合我
在工作中写过的代码,把我的理解总结一下。如果我的理解出现了偏差,请不
吝指正。
一 单例模式
单例模式的定义是产生一个类的唯一实例,但js 本身是一种“无类”语言。很
多讲js 设计模式的文章把{}当成一个单例来使用也勉强说得通。因为js 生成
对象的方式有很多种,我们来看下另一种更有意义的单例。
有这样一个常见的需求,点击某个按钮的时候需要在页面弹出一个遮罩层。比
如 点击登录的时候.
这个生成灰色背景遮罩层的代码是很好写的.
JavaScript
var createMask = function(){
1
2
return
3
document,body.appendChild( document.createElement(div) );
4
5
}
JavaScript
1$( button ).click( function(){
2
3 Var mask = createMask();
4
5 mask.show();
6
7})
问题是, 这个遮罩层是全局唯一的, 那么每次调用createMask 都会创建一个新
的div, 虽然可以在隐藏遮罩层的把它remove 掉. 但显然这样做不合理.
再看下第二种方案, 在页面的一开始就创建好这个div. 然后用一个变量引用
它.
JavaScript
var mask =
1
document.body.appendChild( document.createElement( div ) );
2
3
$( button ).click( function(){
4
5
mask.show();
6
7
} )
这样确实在页面只会创建一个遮罩层div, 但是另外一个问题随之而来, 也许
我们永远都不需要这个遮罩层, 那又浪费掉一个div, 对dom 节点的任何操作
都应该非常吝啬.
如果可以借助一个变量. 来判断是否已经创建过div 呢?
JavaScript
var mask;
1
2
var createMask = function(){
3
4
if ( mask ) return mask;
5
6
else{
7
8
mask =
9
document,body.appendChild( document.createElement(div) );
10
11
return mask;
12
13
}
14
15
}
看起来不错, 到这里的确完成了一个产生单列对象的函数. 我们再仔细看这段
代码有什么不妥.
首先这个函数是存在一定副作用的, 函数体内改变了外界变量mask 的引用, 在
多人协作的项目中, createMask 是个不安全的函数. 另一方面, mask 这个全局
变量并不是非需不可. 再来改进一下.
JavaScript
1var createMask = function(){
2 var mask;
3 return function(){
4 return mask
您可能关注的文档
最近下载
- 典范英语4a Lesson3 The Camcorder课件.pptx VIP
- 全省寄生虫病防治技能竞赛理论考试题及答案.doc VIP
- 医疗纠纷防范与医疗安全培训课件.pptx VIP
- GB∕T 2997-2015 致密定形耐火制品体积密度,显气孔率和真气孔率试验方法.pdf
- 大货车按揭车辆转让协议书.docx VIP
- 2025年福建省中考英语真题.pdf
- 苏教版小学科学二年级下册第二单元《4.磁铁吸力》教学设计.doc VIP
- DB42T 678-2023 茶小绿叶蝉绿色防控技术规程.pdf VIP
- 钳工培训PPT钳工基础知识.ppt VIP
- 三江源国家公园总体规划(2023-2030年).pdf
文档评论(0)