2016年9月15日
摘要: 介绍 本篇我们介绍的一些模式称为初始化模式和性能模式,主要是用在初始化以及提高性能方面,一些模式之前已经提到过,这里只是做一下总结。 立即执行的函数 在本系列第4篇的《立即调用的函数表达式》中,我们已经对类似的函数进行过详细的描述,这里我们只是再举两个简单的例子做一下总结。 // 声明完函数以后,立即执行该函数 (function () { console.log('watch ... 阅读全文
posted @ 2016-09-15 14:08 張暁磊 阅读(129) 评论(0) 推荐(0) 编辑
摘要: 介绍 最近几个月忙得实在是不可开交,终于把《深入理解JavaScript系列》的最后两篇“补全”了,所谓的全是不准确的,因为很多内容都没有写呢,比如高性能、Ajax安全、DOM详解、JavaScript架构等等。但因为经历所限,加上大叔希望接下来写点其它东西,所以此篇文字就暂且当前完结篇的总结吧,以后有时间的话,可以继续加上一些未涉及的专题内容。 网络文章来源 本系列文章参考了大量的互联网... 阅读全文
posted @ 2016-09-15 14:08 張暁磊 阅读(128) 评论(0) 推荐(0) 编辑
摘要: 介绍 本篇主要是介绍Function方面使用的一些技巧(上篇),利用Function特性可以编写出很多非常有意思的代码,本篇主要包括:回调模式、配置对象、返回函数、分布程序、柯里化(Currying)。 回调函数 在JavaScript中,当一个函数A作为另外一个函数B的其中一个参数时,则函数A称为回调函数,即A可以在函数B的周期内执行(开始、中间、结束时均可)。 举例来说,有一个函数用... 阅读全文
posted @ 2016-09-15 14:07 張暁磊 阅读(167) 评论(0) 推荐(0) 编辑
摘要: 介绍 本篇主要是介绍创建对象方面的模式,利用各种技巧可以极大地避免了错误或者可以编写出非常精简的代码。 模式1:命名空间(namespace) 命名空间可以减少全局命名所需的数量,避免命名冲突或过度。一般我们在进行对象层级定义的时候,经常是这样的: var app = app || {}; app.moduleA = app.moduleA || {}; app.moduleA.subM... 阅读全文
posted @ 2016-09-15 14:06 張暁磊 阅读(139) 评论(0) 推荐(0) 编辑
摘要: 介绍 本篇主要是介绍创建对象方面的模式的下篇,利用各种技巧可以极大地避免了错误或者可以编写出非常精简的代码。 模式6:函数语法糖 函数语法糖是为一个对象快速添加方法(函数)的扩展,这个主要是利用prototype的特性,代码比较简单,我们先来看一下实现代码: if (typeof Function.prototype.method !== "function") { Functi... 阅读全文
posted @ 2016-09-15 14:06 張暁磊 阅读(186) 评论(0) 推荐(0) 编辑
摘要: 介绍 本文介绍的四种代码复用模式都是最佳实践,推荐大家在编程的过程中使用。 模式1:原型继承 原型继承是让父对象作为子对象的原型,从而达到继承的目的: function object(o) { function F() { } F.prototype = o; return new F(); } // 要继承的父对象 var parent = { ... 阅读全文
posted @ 2016-09-15 14:05 張暁磊 阅读(180) 评论(0) 推荐(0) 编辑
摘要: 介绍 任何编程都提出代码复用,否则话每次开发一个新程序或者写一个新功能都要全新编写的话,那就歇菜了,但是代码复用也是有好要坏,接下来的两篇文章我们将针对代码复用来进行讨论,第一篇文避免篇,指的是要尽量避免使用这些模式,因为或多或少有带来一些问题;第二排是推荐篇,指的是推荐大家使用的模式,一般不会有什么问题。 模式1:默认模式 代码复用大家常用的默认模式,往往是有问题的,该模式使用Paren... 阅读全文
posted @ 2016-09-15 14:04 張暁磊 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 介绍 桥接模式(Bridge)将抽象部分与它的实现部分分离,使它们都可以独立地变化。 正文 桥接模式最常用在事件监控上,先看一段代码: addEvent(element, 'click', getBeerById); function getBeerById(e) { var id = this.id; asyncRequest('GET', 'beer.uri?id=' + id, f... 阅读全文
posted @ 2016-09-15 14:03 張暁磊 阅读(191) 评论(0) 推荐(0) 编辑
摘要: 介绍 原型模式(prototype)是指用原型实例指向创建对象的种类,并且通过拷贝这些原型创建新的对象。 正文 对于原型模式,我们可以利用JavaScript特有的原型继承特性去创建对象的方式,也就是创建的一个对象作为另外一个对象的prototype属性值。原型对象本身就是有效地利用了每个构造器创建的对象,例如,如果一个构造函数的原型包含了一个name属性(见后面的例子),那通过这个构造函... 阅读全文
posted @ 2016-09-15 14:02 張暁磊 阅读(181) 评论(0) 推荐(0) 编辑
摘要: 介绍 状态模式(State)允许一个对象在其内部状态改变的时候改变它的行为,对象看起来似乎修改了它的类。 正文 举个例子,就比如我们平时在下载东西,通常就会有好几个状态,比如准备状态(ReadyState)、下载状态(DownloadingState)、暂停状态(DownloadPausedState)、下载完毕状态(DownloadedState)、失败状态(DownloadFailed... 阅读全文
posted @ 2016-09-15 14:02 張暁磊 阅读(139) 评论(0) 推荐(0) 编辑
摘要: 介绍 模板方法(TemplateMethod)定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 模板方法是一种代码复用的基本技术,在类库中尤为重要,因为他们提取了类库中的公共行为。模板方法导致一种反向的控制结构,这种结构就是传说中的“好莱坞法则”,即“别找找我们,我们找你”,这指的是父类调用一个类的操作,而不是相... 阅读全文
posted @ 2016-09-15 14:01 張暁磊 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 介绍 适配器模式(Adapter)是将一个类(对象)的接口(方法或属性)转化成客户希望的另外一个接口(方法或属性),适配器模式使得原本由于接口不兼容而不能一起工作的那些类(对象)可以一些工作。速成包装器(wrapper)。 正文 我们来举一个例子,鸭子(Dock)有飞(fly)和嘎嘎叫(quack)的行为,而火鸡虽然也有飞(fly)的行为,但是其叫声是咯咯的(gobble)。如果你非要火鸡... 阅读全文
posted @ 2016-09-15 14:00 張暁磊 阅读(155) 评论(0) 推荐(0) 编辑
摘要: 介绍 组合模式(Composite)将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。 常见的场景有asp.net里的控件机制(即control里可以包含子control,可以递归操作、添加、删除子control),类似的还有DOM的机制,一个DOM节点可以包含子节点,不管是父节点还是子节点都有添加、删除、遍历子节点的通用功能。所以说组... 阅读全文
posted @ 2016-09-15 14:00 張暁磊 阅读(138) 评论(0) 推荐(0) 编辑
摘要: 介绍 职责链模式(Chain of responsibility)是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。 也就是说,请求以后,从第一个对象开始,链中收到请求的对象要么亲自处理它,要么转发给链中的下一个候选者。提交请求的对象并不明确知道哪一个对象将会处理它——也就是该请求有一个隐式的接受... 阅读全文
posted @ 2016-09-15 13:59 張暁磊 阅读(128) 评论(0) 推荐(0) 编辑
摘要: 介绍 中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 主要内容来自:http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/#mediatorpatternjavascript 正文 软件开发中,中介... 阅读全文
posted @ 2016-09-15 13:58 張暁磊 阅读(156) 评论(0) 推荐(0) 编辑
摘要: 介绍 享元模式(Flyweight),运行共享技术有效地支持大量细粒度的对象,避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类)。 享元模式可以避免大量非常相似类的开销,在程序设计中,有时需要生产大量细粒度的类实例来表示数据,如果能发现这些实例除了几个参数以外,开销基本相同的 话,就可以大幅度较少需要实例化的类的数量。如果能把那些参数移动到类实例的外面,在方法调用的时候... 阅读全文
posted @ 2016-09-15 13:58 張暁磊 阅读(163) 评论(0) 推荐(0) 编辑
摘要: 介绍 迭代器模式(Iterator):提供一种方法顺序一个聚合对象中各个元素,而又不暴露该对象内部表示。 迭代器的几个特点是: 1.访问一个聚合对象的内容而无需暴露它的内部表示。 2.为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。 3.遍历的同时更改迭代器所在的集合结构可能会导致问题(比如C#的foreach里不允许修改item)。 正文 一般的迭... 阅读全文
posted @ 2016-09-15 13:57 張暁磊 阅读(138) 评论(0) 推荐(0) 编辑
摘要: 介绍 策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。 正文 在理解策略模式之前,我们先来一个例子,一般情况下,如果我们要做数据合法性验证,很多时候都是按照swith语句来判断,但是这就带来几个问题,首先如果增加需求的话,我们还要再次修改这段代码以增加逻辑,而且在进行单元测试的时候也会越来越复杂,代码如下: val... 阅读全文
posted @ 2016-09-15 13:56 張暁磊 阅读(149) 评论(0) 推荐(0) 编辑
摘要: 介绍 命令模式(Command)的定义是:用于将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及执行可撤销的操作。也就是说改模式旨在将函数的调用、请求和操作封装成一个单一的对象,然后对这个对象进行一系列的处理。此外,可以通过调用实现具体函数的对象来解耦命令对象与接收对象。 正文 我们来通过车辆购买程序来展示这个模式,首先定义车辆购买的具体操作... 阅读全文
posted @ 2016-09-15 13:56 張暁磊 阅读(153) 评论(0) 推荐(0) 编辑
摘要: 介绍 观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。 使用观察者模式的好处: 支持简单的广播通信,自动通知所有已经订阅过的对象。 页面载入后目标对象很容易与观察者存在一种动态关联,增加了灵活性。 目标对象与观察者之间的抽象耦合关... 阅读全文
posted @ 2016-09-15 13:55 張暁磊 阅读(137) 评论(0) 推荐(0) 编辑