(译)《学习JavaScript设计模式》(一)

本文探讨了设计模式在JavaScript中的重要性及其三大优势:提供成熟可靠的解决方案、易于重用且具良好表现力。此外,文章还介绍了模式如何帮助开发者提高代码质量、减少冗余并促进团队间的有效沟通。

原书链接Learning JavaScript Design Patterns
水平有限很多地方不通顺,错翻漏翻欢迎交流。

什么是模式?

模式是一种可普遍应用于软件设计——对我们前端人员来讲就是JavaScript网络应用程序的可重用方案。或者说是一种可用于解决很多不同情况的模板。

所以理解模式对我们来说究竟有什么好处呢?设计模式主要有三点优势:

  1. 模式是成熟的解决方案: 它使用成熟的技术为软件开发中问题提供了可靠的方法,这些技术反映了为模式定义的开发的经验和见解。

  2. 模式易于重用: 模式通常反映了一个很好的可适应我们本身需求的方法。这个特征使得它鲁棒性很好。

  3. 模式有很好的表现力: 模式通常都有一个解决方案的关键词用法和语法结构,通过它我们可以让大型的解决方案表现得更优雅。

模式并不就是一个具体的解决方案。我们要记住模式的角色仅仅就是给我们提供一个解决方案体系。模式并不能解决所有的设计问题,也不能取代一个好的设计师,但它确实能成为设计师的好帮手。接下来我们来讨论一下模式的其他一些优势。

  • 模式可以防患于未然: 当我们的代码是建立在成熟的模式上时,我们可以花更少的时间考虑我们的代码结构,而把更多的时间放在我们的总的解决方案的质量上。这是由于模式总是鼓励我们以结构化和组织化的方式来编写代码,很好地避免了一些未来重构代码的需求。

  • 模式可以提供文档化的通用解决方案,不会被某个单独问题所限制: 这种通用化的方式意味着我们不需要被应用(通常是编程语言的不同)所限制,设计模式仍然可以改善我们代码的结构。

  • 特定的模式确实可以避免重复来减少代码量: 通过鼓励开发者在容易减少代码重复区域更加警惕(比如用一个通用函数来取代减少执行函数)。这也就是我们所说的让代码更加'DRY'

  • 模式添加到开发者的字典中可以让他们交流更加方便

  • 频繁被使用的模式可以随着开发者在社区中交流得到改善: 在某些情况这可以引领一种全新的设计模式,并让它更好地适应更多的具体情况。这可以保持基于模式的解决方案保持健壮性,甚至超过点对点的解决方案。

我们已经天天在用模式了

为了理解模式究竟多吊,我们来回顾一个jQuery已经帮我们解决的元素选择的问题。

假设我们有个script,在DOM中为每个找到的class为"foo"的元素添加一个计数器。效率最高的查询方法是什么?来看看下面几种解决方案:

  1. 选择页面中的所有DOM元素并存储他们的引用,然后通过正则表达式(或者其他的方法)来过滤只存储那些class"foo"的元素。

  2. 使用本地浏览器的方法比如querySelectorAll()来选择所有class"foo"的元素。

  3. 使用原生方法比如getElementsByClassName()来类似地选择所需集合。

所以这仨哪个快呢?事实上是<3>,它是其他俩的8-10倍。但是天不遂人愿,<3>在IE9以下是没用的,一次在<2>和<3>都不支持的环境下只能使用<1>了。

然而使用jQuery的开发者就不用愁了,因为它为我们这些使用外观模式的把选择器抽象出来了。我们后面会提到,这种模式为以后一些潜在的负载代码提供了一些抽象接口(比如$el.css(), $el.animate())。这意味这我们不需要花太多的时间在实现细节上了。

jQuery还自动地根据我们的浏览器来挑选选择器方法。

我们可能都熟悉jQuery的$("selector"),同样是选择HTML元素,它比起getElementById(), getElementsByClassName(), getElementByTagName()等方法来说方便多了。

我们知道querySelectorAll()也试图做同样的事,比较一下使用jQuery的模式VS我们自己来选择。后者毫无竞争力(?)。抽象使用模式有现实价值。

在本书的后面我们将继续讨论更多的设计模式。

第1章 简介   模式   JavaScript:基本概念   ECMAScript 5   JSLint   Console   第2章 基本技巧   编写可维护的代码   尽量少用全局变量   for循环   for-in循环   不要增加内置的原型   SWitch模式   避免使用隐式类型转换   使用parseInt()的数值约定   编码约定   命名约定   编写注释   编写API文档   编写可读性强的代码   同行互查   在正式发布时精简代码   运行JSLint   小结   第3章 字面量和构造函数   对象字面量   自定义构造函数   强制使用new的模式   数组字面量   JSON   正则表达式字面量   基本值类型包装器   错误对象   小结   第4章 函数   背景   回调模式   返回函数   自定义函数   即时函数   即时对象初始化   初始化时分支   函数属性——备忘模式   配置对象   Curry   小结   第5章 对象创建模式   命名空间模式   声明依赖关系   私有属性和方法   模块模式   沙箱模式   静态成员   对象常量   链模式   method()方法   小结   第6章 代码复用模式   传统与现代继承模式的比较   使用类式继承时的预期结果   类式继承模式#1——默认模式   类式继承模式#2——借用构造函数   类式继承模式#3——借用和设置原型   类式继承模式#4——共享原型   类式继承模式#5——临时构造函数   Klass   原型继承   通过复制属性实现继承   借用方法   小结   第7章 设计模式   单体模式   工厂模式   迭代器模式   装饰者模式   策略模式   外观模式   代理模式   中介者模式   观察者模式   小结   第8章 DOM和浏览器模式   关注分离   DOM脚本   事件   长期运行脚本   远程脚本   配置JavaScript   载入策略
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值