刚入职时,看过一段时间的设计模式,似懂非懂。不知不觉过去七个月了,对JS的理解更深刻了,数据结构与算法的基础也基本上算是过了一遍了,接下来要把设计模式搞定,然后不再深层次研究JS了,而是学习前端自动化、linux、数据库、服务器等的相关知识。

虽然各种模式非常有用,但我们编写业务代码的时候,往往不需要去预先猜测是否需要使用模式,当发现不方便维护和扩展的时候,再编写也不迟。

设计模式的学习主要参考《JavaScript设计模式与开发实践》一书,很多笔记也会从该书抄录。开始JS设计模式的学习。

1.原型模式

  原型模式既是一种设计模式,也是一种编程泛型。原型模式是JS最基础的继承实现,在这儿就不多讲了,写一下JS原型继承的基本原则:

  所有的数据都是对象;

  要得到一个对象,不是通过实例化类,而是找到一个对象作为原型并克隆它;

  对象会记住它的原型;

  如果对象无法响应某个请求,它会把这个请求委托给它自己的原型。

2.单例模式

  在写单例模式前,先补一个this的知识点。

  document.getElementById这个方法名实在太长,我们大概尝试过用一个短的函数代替它:

    var getId = id => document.getElementById(id);
getId('div1');

  我们也许思考过为什么不能用下面更简单的方式:

    var getId = document.getElementById;
getId('div1');

  在Chrome、IE10中执行会发现报错。因为许多引擎的document.getElementById方法内部实现用到了this。这个this本来期望指向document,但用getId来引用document.getElementById后,变成了普通函数调用,this指向了window。

  正式开始单例模式。

  单例模式的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

  相比于传统的面相对象语言,JS的单例模式很容易实现:

        var getSingle = function  (fn) {
var result;
return function () {
return result || (result = fn.apply(this, arguments));
// return result || (result = fn());
}
};

  说下这个单例的使用方法。假如我们要在页面里创造一个唯一的登录窗口,给窗口刚创建的时候是隐藏的,通过点击按钮后会显示出来,下面是代码:

        var createLoginLayer = function (){
var div = document.createElement('div');
div.innerHTML = '我是登录窗口';
div.style.display = 'none';
document.body.appendChild(div);
return div;
}; var createSingleLoginLayer = getSingle(createLoginLayer);
document.getElementById('loginBtn').onclick = function (){
var loginLayer = createSingleLoginLayer();
loginLayer.style.display = 'block';
};

  这就是这个单例的使用。在本例中,getSingle 返回的return result || (result = fn.apply(this, arguments));可以改成return result || (result = fn()); ,因为apply作用在了window上,而且没有传参,若需要传参的话,还是用apply吧。

3.策略模式

  策略模式的定义:定义一系列的算法,把它们一个一个封装起来,并且使它们可以相互替换。以年底绩效考核发奖金为例,绩效为S的员工4倍工资,A的2.7倍工资,B的2倍工资。现在写一段代码,来计算员工的年终奖。

        var strategies = {
S: function (salary) {
return salary * 4;
},
A: function (salary) {
return salary * 2.7;
},
B: function (salary) {
return salary * 2;
}
}; var calculateBonus = function (level, salary) {
return strategies[level](salary);
}; console.log(calculateBonus('S', 20000));

  策略模式的程序至少由两部分组成。第一部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。第二个部分是环境类,环境类接受客户的请求,随后把请求委托给某一个策略类。要做到这点,说明环境类中要维持对某个策略对象的引用。

4.代理模式

  代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问。代理模式的变体种类非常多,这是写个比较简单的来理解。一个求积程序,可以把它脑补为一个复杂的计算。

        var proxyMult = (function  () {
var cache = {};
return function () {
var args = Array..prototype.join.call(arguments, ',');
if (args in cache) {
return cache[args];
}
return cache[args] = mult.apply(this,arguments);
} })(); proxyMult(1, 2, 3, 4);
proxyMult(1, 2, 3, 4);

  

JS设计模式(一)的更多相关文章

  1. js设计模式(12)---职责链模式

    0.前言 老实讲,看设计模式真得很痛苦,一则阅读过的代码太少:二则从来或者从没意识到使用过这些东西.所以我采用了看书(<js设计模式>)和阅读博客(大叔.alloyteam.聂微东)相结合 ...

  2. JS设计模式——5.单体模式

    JS设计模式——5.单体模式 http://www.cnblogs.com/JChen666/p/3610585.html   单体模式的优势 用了这么久的单体模式,竟全然不知!用它具体有哪些好处呢? ...

  3. js 设计模式-接口

    js模拟java接口检测函数:确保子类实现接口中的方法:(出自js设计模式) 上代码: <script type="text/javascript" > <%-- ...

  4. 前端笔记之JavaScript面向对象(三)初识ES6&underscore.js&EChart.js&设计模式&贪吃蛇开发

    一.ES6语法 ES6中对数组新增了几个函数:map().filter().reduce() ES5新增的forEach(). 都是一些语法糖. 1.1 forEach()遍历数组 forEach() ...

  5. [js]js设计模式小结

    js设计模式小结 工厂模式/构造函数--减少重复 - 创建对象有new - 自动创建obj,this赋值 - 无return 原型链模式 - 进一步去重 类是函数数据类型,每个函数都有prototyp ...

  6. [js]设计模式小结&对原型的修改

    js设计模式小结 工厂模式/构造函数--减少重复 - 创建对象有new - 自动创建obj,this赋值 - 无return 原型链模式 - 进一步去重 类是函数数据类型,每个函数都有prototyp ...

  7. js设计模式总结1

    js设计模式有很多种,知道不代表会用,更不代表理解,为了更好的理解每个设计模式,对每个设计模式进行总结,以后只要看到总结,就能知道该设计模式的作用,以及模式存在的优缺点,使用范围. 本文主要参考张容铭 ...

  8. js设计模式-观察者模式

    定义: 观察者模式又叫发布订阅模式,它定义了对象间的一种一对多的依赖关系.观察者模式让两个对象松耦合地联系在一起,虽然不太清楚彼此的细节,但这不影响他们之间的互相通信. 思路 定义一个对象,在对象中实 ...

  9. js设计模式:工厂模式、构造函数模式、原型模式、混合模式

    一.js面向对象程序 var o1 = new Object();     o1.name = "宾宾";     o1.sex = "男";     o1.a ...

随机推荐

  1. SSH框架整合(全注解)

    全部jar包    目录结构  配置案例 package cn.yzu.Tbook.action; import javax.annotation.Resource; import org.apach ...

  2. 进击的Python【第三章】:Python基础(三)

    Python基础(三) 本章内容 集合的概念与操作 文件的操作 函数的特点与用法 参数与局部变量 return返回值的概念 递归的基本含义 函数式编程介绍 高阶函数的概念 一.集合的概念与操作 集合( ...

  3. mybatis map常用数据类型

    JDBC Type Java Type CHAR String VARCHAR String LONGVARCHAR String NUMERIC java.math.BigDecimal DECIM ...

  4. 获取html 中的内容 将前台的数据获取到后台

    使用js创建一个form表单 ,使用post上传到后台中 下面是代码.在获取html内容的时候使用了js节点来获取内容. parent:父节点.上一级的节点 siblings:兄弟节点.同一级别的节点 ...

  5. 2016-1-30 Servlet中Session管理(Sesssion追踪)

    Session管理(Sesssion追踪)是Web应用程序开发中非常重要的一个主题.这是因为HTTP是无状态的,在默认情况下,Web服务器不知道一个HTTP请求是来自初次用户,还是来自之前已经访问过的 ...

  6. 16-01-25---Servlet复习笔记(01)

    Servlet ServletAPI中有4个java包    javax.servlet 包含Servlet与Servlet容器之间契约的类和接口    javax.servlet.http 包含HT ...

  7. 时代杂志发文:2017 AR/MR将变得比VR更加重要

    每到年末都有很多企业或高管分析科技产业明年趋势.近日,时代杂志网页版刊登了2017年科技行业的五大趋势和热点话题的预测.该本作者TimBajarin,是硅谷市场研究公司CreativeStrategi ...

  8. Day 2:增加SplashScreen

    If you want to add just single image, then create a pic in the size of 480*800 and name it as Splash ...

  9. AmazeUI 框架知识点-组件

    1.Badge 默认:添加 .am-badge class 到 <div> 或者 <span> 元素. 圆角:在默认样式的基础上添加 .am-radius class. 椭圆: ...

  10. 用ProxyFactoryBean创建AOP代理

    Spring的Advisor是Pointcut和Advice的配置器,它是将Advice注入程序中Pointcut位置的代码.org.springframework.aop.support.Defau ...