JS设计模式(一)
刚入职时,看过一段时间的设计模式,似懂非懂。不知不觉过去七个月了,对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设计模式(一)的更多相关文章
- js设计模式(12)---职责链模式
0.前言 老实讲,看设计模式真得很痛苦,一则阅读过的代码太少:二则从来或者从没意识到使用过这些东西.所以我采用了看书(<js设计模式>)和阅读博客(大叔.alloyteam.聂微东)相结合 ...
- JS设计模式——5.单体模式
JS设计模式——5.单体模式 http://www.cnblogs.com/JChen666/p/3610585.html 单体模式的优势 用了这么久的单体模式,竟全然不知!用它具体有哪些好处呢? ...
- js 设计模式-接口
js模拟java接口检测函数:确保子类实现接口中的方法:(出自js设计模式) 上代码: <script type="text/javascript" > <%-- ...
- 前端笔记之JavaScript面向对象(三)初识ES6&underscore.js&EChart.js&设计模式&贪吃蛇开发
一.ES6语法 ES6中对数组新增了几个函数:map().filter().reduce() ES5新增的forEach(). 都是一些语法糖. 1.1 forEach()遍历数组 forEach() ...
- [js]js设计模式小结
js设计模式小结 工厂模式/构造函数--减少重复 - 创建对象有new - 自动创建obj,this赋值 - 无return 原型链模式 - 进一步去重 类是函数数据类型,每个函数都有prototyp ...
- [js]设计模式小结&对原型的修改
js设计模式小结 工厂模式/构造函数--减少重复 - 创建对象有new - 自动创建obj,this赋值 - 无return 原型链模式 - 进一步去重 类是函数数据类型,每个函数都有prototyp ...
- js设计模式总结1
js设计模式有很多种,知道不代表会用,更不代表理解,为了更好的理解每个设计模式,对每个设计模式进行总结,以后只要看到总结,就能知道该设计模式的作用,以及模式存在的优缺点,使用范围. 本文主要参考张容铭 ...
- js设计模式-观察者模式
定义: 观察者模式又叫发布订阅模式,它定义了对象间的一种一对多的依赖关系.观察者模式让两个对象松耦合地联系在一起,虽然不太清楚彼此的细节,但这不影响他们之间的互相通信. 思路 定义一个对象,在对象中实 ...
- js设计模式:工厂模式、构造函数模式、原型模式、混合模式
一.js面向对象程序 var o1 = new Object(); o1.name = "宾宾"; o1.sex = "男"; o1.a ...
随机推荐
- SSH框架整合(全注解)
全部jar包 目录结构 配置案例 package cn.yzu.Tbook.action; import javax.annotation.Resource; import org.apach ...
- 进击的Python【第三章】:Python基础(三)
Python基础(三) 本章内容 集合的概念与操作 文件的操作 函数的特点与用法 参数与局部变量 return返回值的概念 递归的基本含义 函数式编程介绍 高阶函数的概念 一.集合的概念与操作 集合( ...
- mybatis map常用数据类型
JDBC Type Java Type CHAR String VARCHAR String LONGVARCHAR String NUMERIC java.math.BigDecimal DECIM ...
- 获取html 中的内容 将前台的数据获取到后台
使用js创建一个form表单 ,使用post上传到后台中 下面是代码.在获取html内容的时候使用了js节点来获取内容. parent:父节点.上一级的节点 siblings:兄弟节点.同一级别的节点 ...
- 2016-1-30 Servlet中Session管理(Sesssion追踪)
Session管理(Sesssion追踪)是Web应用程序开发中非常重要的一个主题.这是因为HTTP是无状态的,在默认情况下,Web服务器不知道一个HTTP请求是来自初次用户,还是来自之前已经访问过的 ...
- 16-01-25---Servlet复习笔记(01)
Servlet ServletAPI中有4个java包 javax.servlet 包含Servlet与Servlet容器之间契约的类和接口 javax.servlet.http 包含HT ...
- 时代杂志发文:2017 AR/MR将变得比VR更加重要
每到年末都有很多企业或高管分析科技产业明年趋势.近日,时代杂志网页版刊登了2017年科技行业的五大趋势和热点话题的预测.该本作者TimBajarin,是硅谷市场研究公司CreativeStrategi ...
- 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 ...
- AmazeUI 框架知识点-组件
1.Badge 默认:添加 .am-badge class 到 <div> 或者 <span> 元素. 圆角:在默认样式的基础上添加 .am-radius class. 椭圆: ...
- 用ProxyFactoryBean创建AOP代理
Spring的Advisor是Pointcut和Advice的配置器,它是将Advice注入程序中Pointcut位置的代码.org.springframework.aop.support.Defau ...