javascript设计模式
- 格式:pdf
- 大小:946.07 KB
- 文档页数:30
《JavaScript网页特效设计》课程实施教学做合一的研究与实践摘要:javascript在现在的网页设计中扮演的角色越来越重要,jquery就是其典型的应用实例。
作为职业院校计算机软件或网页相关专业必须开设的一门课程,如何利用现代信息化手段,多方面综合的去设计这个课程,使其更符合实际的开发应用,也容易使用学生们接受是本文件讨论的重要内容。
本文从现在课程出现的问题,课程设计的背景与意义,研究的思路,研究内容与方法等方面进行了全面的描述。
关键词:javascript;课程开发;教学做合一中图分类号:tp312随着html5和ajax的升温,javascript越来越得到人们的重视。
重要的是,ajax在一定程度上带来了web软件架构上的变化,特别是在移动开发领域,hmtl5+javascript+css技术彻底击败flash,成为各大移供应商支持的技术。
人们把越来越多的功能分配到客户端实现,javascript子项目规模越来越大。
如何更高效的使用javascript,如何更科学的组织javascript,如何更顺利的保证项目进展?都变成很重要的工作。
由于javascript是“世界上最被误解的语言”,大部分人对javascript语法并没有全面了解过,只是凭借看起来很像c或者java的关键字按照自己的理解写javascript代码。
其实javascript是一种很独特的语言,和c++/java有非常大的区别,要想用javascript做大一些的项目,开发人员必须老老实实的学习javascript的语法。
真正掌握了语法后,才不会把delete看成释放内存对象,才不会为到底参数传递是值传递还是引用传递而烦恼。
真正理解了javascript的基于原型的dom操作方式,才可能写出具有良好架构的javascript程序。
1 问题提出目前“javascript网页特效设计”类课程在职业院校软件及相关专业普遍开设,也是未来网站友好互动发展的方向。
javascript高级程序设计pdf《JavaScript高级程序设计》是由著名的JavaScript专家Nicholas C. Zakas所著的一本关于JavaScript语言的权威教材。
本书的字数接近1000页,内容涵盖了从基础到进阶的JavaScript知识,适合想要深入学习JavaScript的开发人员阅读。
全书共分为三个部分,分别是JavaScript和HTML的基础知识、JavaScript的核心概念以及使用框架和库开发高级应用程序。
在第一部分中,作者详细介绍了JavaScript的基本语法、数据类型、运算符等基础知识,并通过示例讲解了如何使用JavaScript与HTML文档进行交互。
此外,作者还介绍了JavaScript中的一些常用的设计模式,以及如何使用面向对象编程的方式来组织代码。
在第二部分中,作者深入讲解了JavaScript的核心概念,包括作用域、闭包、原型链、执行上下文等。
这些概念对于理解JavaScript的底层原理和实现机制非常重要,同时也是进阶开发的基础。
在第三部分中,作者介绍了一些常用的JavaScript框架和库,包括jQuery、AngularJS、React等。
通过使用这些框架和库,开发人员可以更高效地编写JavaScript代码,并且能够快速构建复杂的Web应用程序。
总体来说,《JavaScript高级程序设计》是一本非常全面和深入的JavaScript教材,适合想要进一步提升JavaScript编程能力的开发人员阅读。
通过学习本书,读者可以了解JavaScript 的高级特性和应用,并且能够运用这些知识来解决实际开发中的问题。
无论是初学者还是有一定经验的开发人员都可以从本书中获得很大的帮助。
第一章1、大小写敏感2、空格与换行代码中多余的空格会被忽略,同一个标识符的所有字母必须连续;一行代码可以分成多行书写;3、单行代码写于一行中,用分号作为语句结束标志4、可有可无的分号当两个程序语句处于一行中时用分号隔开,否则可以不用分号Eg:var r = 2var pi = Math.PIvar s = pi * r * rdocument.write("半径为2单位的圆面积为:" + s + "单位")第二章2.1基本数据类型●在JavaScript中,字符串型数据是用引号括起的文本字符串。
在JavaScript中不区分“”和“”,字符也被当作字符串处理。
字符串中可以包含用于特殊目的的字符。
Eg:var hello = "你好啊";var name = 'Peter';document.write(hello + name+"<br>");●数值类型JavaScript中用于表示数字的类型成为数字型,不像其他编程语言那样区分整型、浮点型。
数字型用双精度浮点值来表示数字数据,可以表示(-253,+253)区间中的值。
数字的值可以用普通的记法也可以使用科学记数法。
表示方法如下所示:Eg:10;// 数字,普通记法10.1;// 数字,普通记法0.1;// 数字,普通记法3e7;// 科学记数0.3E7;// 科学记数2.2 复合数据类型●对象概念在面向对象的设计模式中,将数据和处理数据的方法捆绑在一起形成的整体,称为对象。
它封装了数据和操作数据的方法,使用时要先创建这个对象,用new 运算符来调用对象的构造函数。
Eg: date=new Date();●日期对象JavaScript将与日期相关的所有特性封装进Date对象,主要用来进行一些与时间相关的操作,比如获取当前系统时间,使用前要先创建该对象的一个实例。
JavaScript⽤策略模式消除ifelse和switchjs程序中最常⽤的if else循环,如果分枝很多的的情况下难免使写出的程序⼜臭⼜长,但是根据需求⼜必须将这些分⽀处理,此时稍有经验的程序员可能会想到⽤switch case优化但是只是仅仅做到利于阅读,最好的⽅法是⽤策略模式进⾏优化。
那么如何拒绝使⽤if else呢?如果程序中只有⼀个else:if(con){dosomething();}else{dootherthings();}可以⽤如下的⽅法拒绝else:if(con){dosomething();return;}dootherthings();或者⽤三⽬运算符:con ? dosometing() : dootherthings();如果程序中有多个else:if(con1){dothing1();}else if(con2){dothing2();}else if(con3){dothing3();}或者像我们系统⾥⾯这样:可以⽤策略树实现:var stats ={obj1:function(){ doSomething1();},obj2:function(){ doSomething2();},obj3:function(){ doSomething3();},obj4:function(){ doSomething4();},obj5:function(){ doSomething5();}}调⽤:function handle(obj){ stats[]();}我是这样实现的注释部分是之前的写法,箭头部分是我优化的内容。
函数定义。
如果没有调⽤⽅法,可以⽤⾯向对象思想,⽤健值对实现,⽐switch要简单:总结使⽤if...else...的弊端在于:不利于对程序的扩展,如果新添加了⼀个颜⾊类型,那么就得去修改程序再添加⼀个if...else...分⽀,根据“开-闭原则”的宗旨:对扩展开,对修改闭。
简述代码的种类代码的种类及其简述一、编程语言编程语言是一种用于编写计算机程序的形式化语言。
它可以被用来创建各种应用程序、网站和软件。
不同的编程语言有不同的语法和特点,适用于不同的编程任务和目标。
常见的编程语言包括:1. C语言:一种通用的、底层的编程语言,广泛用于系统软件和嵌入式开发。
2. Java:一种面向对象的高级编程语言,被广泛用于企业级应用程序开发。
3. Python:一种简单易学的高级编程语言,适用于数据分析、人工智能和网站开发等领域。
4. JavaScript:一种用于网页开发的脚本语言,可以为网页添加动态交互和效果。
5. Ruby:一种简洁而优雅的编程语言,被广泛用于Web应用程序开发。
6. PHP:一种用于服务器端脚本编程的语言,特别适用于Web开发。
二、算法算法是一系列解决问题的步骤或规则。
它是计算机程序设计的基础,用于解决各种复杂的问题。
常见的算法包括:1. 排序算法:用于将一组数据按照某种规则进行排序,如冒泡排序、插入排序和快速排序等。
2. 查找算法:用于在一组数据中查找特定的元素,如线性查找和二分查找等。
3. 图算法:用于解决图论相关的问题,如最短路径问题和最小生成树问题等。
4. 动态规划算法:一种将复杂问题分解为更小的子问题来解决的方法,适用于求解最优化问题。
5. 贪心算法:一种通过每一步的局部最优选择来达到整体最优的方法,适用于一些特定的问题。
6. 分治算法:一种将问题分解为更小的子问题并分别解决的方法,适用于解决一些递归性质的问题。
三、数据结构数据结构是一种组织和存储数据的方式,用于有效地访问和操作数据。
不同的数据结构适用于不同的应用场景,可以提高程序的效率和性能。
常见的数据结构包括:1. 数组:一种连续存储数据的结构,可以通过下标快速访问和修改元素。
2. 链表:一种非连续存储数据的结构,通过指针将各个节点连接起来。
3. 栈:一种先进后出的数据结构,只能在栈顶进行插入和删除操作。
dialog弹窗用法Dialog弹窗是一种常见的用户界面设计模式,用于向用户显示重要的信息或提供某种交互方式。
以下是一个使用JavaScript实现Dialog弹窗的示例:```javascript// 创建一个Dialog弹窗function showDialog(title, message, callback) {// 创建Dialog弹窗的HTML元素var dialog = document.createElement("div");dialog.setAttribute("class", "dialog");// 创建Dialog弹窗的标题var titleElement = document.createElement("h2");titleElement.textContent = title;dialog.appendChild(titleElement);// 创建Dialog弹窗的消息内容var messageElement = document.createElement("p"); messageElement.textContent = message;dialog.appendChild(messageElement);// 创建Dialog弹窗的关闭按钮var closeButton = document.createElement("button"); closeButton.textContent = "关闭";closeButton.addEventListener("click", function() {dialog.style.display = "none";});dialog.appendChild(closeButton);// 将Dialog弹窗添加到页面中document.body.appendChild(dialog);// 显示Dialog弹窗dialog.style.display = "block";// 如果提供了回调函数,则在用户点击关闭按钮时执行该函数if (callback) {closeButton.addEventListener("click", callback);}}// 使用Dialog弹窗showDialog("提示", "您确定要执行这个操作吗?", function() {// 在这里添加用户点击关闭按钮后的处理逻辑});```在这个示例中,`showDialog`函数接受三个参数:`title`表示Dialog弹窗的标题,`message`表示Dialog弹窗的消息内容,`callback`表示在用户点击关闭按钮后要执行的回调函数。
window.location.href的⽤法(动态输出跳转)javascript中的location.href有很多种⽤法,主要如下。
self.location.href="/url" 当前页⾯打开URL页⾯location.href="/url" 当前页⾯打开URL页⾯windows.location.href="/url" 当前页⾯打开URL页⾯,前⾯三个⽤法相同。
this.location.href="/url" 当前页⾯打开URL页⾯parent.location.href="/url" 在⽗页⾯打开新页⾯top.location.href="/url" 在顶层页⾯打开新页⾯如果页⾯中⾃定义了frame,那么可将parent self top换为⾃定义frame的名称,效果是在frame窗⼝打开url地址此外,window.location.href=window.location.href;和window.location.Reload()和都是刷新当前页⾯。
区别在于是否有提交数据。
当有提交数据时,window.location.Reload()会提⽰是否提交,window.location.href=window.location.href;则是向指定的url提交数据在写程序的时候,我们经常遇到跳转页⾯的问题,我们经常使⽤Response.Redirect 做框架页跳转,如果客户要在跳转的时候使⽤提⽰,这个就不灵光了,如:复制代码代码如下:Response.Write("< script>alert('恭喜您,注册成功!');< /script>");Response.Redirect("main.html");这时候我们的提⽰内容没有出来就跳转了,和Response.Redirect("main.html");没有任何区别。
走马灯应用的原理1. 什么是走马灯应用?走马灯应用是一种常见的用户界面设计模式,用于展示一系列内容,通常是图片或者文字。
走马灯应用会在相同位置连续循环显示这些内容,通过自动切换和过渡效果,吸引用户的注意力。
2. 走马灯应用的实现方式走马灯应用的实现方式有多种,下面介绍两种常见的实现方式。
2.1 使用CSS动画和JavaScript一种常见的实现走马灯应用的方式是使用CSS动画和JavaScript。
具体实现步骤如下:1.创建一个包含所有内容的容器,设置定位为相对定位,并设置宽度为容器可以显示的内容宽度。
2.在容器内部创建一个包含所有内容的子容器,设置定位为绝对定位,并设置宽度为所有内容宽度之和。
3.使用CSS动画来实现内容的滚动效果。
可以通过设置动画的keyframes来实现从左到右的滚动效果,也可以通过设置transition来实现平滑的过渡效果。
4.使用JavaScript来控制动画的播放。
可以使用计时器来定时触发动画,或者在用户交互时通过监听事件来触发动画。
2.2 使用JavaScript库除了使用CSS动画和JavaScript来手动实现走马灯应用,还可以使用一些JavaScript库来简化实现过程。
以下是一些常用的JavaScript库:•Slick:一个功能强大且易于使用的走马灯库,提供了丰富的配置选项和自定义样式的能力。
•Swiper:一款移动端优先的走马灯库,支持多种功能,如滑动、淡入淡出等,并具有响应式布局的能力。
•Carousel:一个轻量级的走马灯库,支持无限循环、自动播放和响应式布局。
3. 走马灯应用的优势走马灯应用在用户界面设计中有一些优势,下面列举几点:•提升用户体验:走马灯应用能够以视觉上吸引人的方式展示内容,吸引用户的注意力,提升用户体验。
•节省空间:走马灯应用可以在有限的空间内展示多个内容,节省界面空间。
•易于导航:用户可以通过导航按钮或者滑动手势来切换内容,提供了更直观的导航方式。
mvc js调用model中的方法MVC(Model-View-Controller)是一种常用的软件设计模式,它将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。
在前端开发中,使用JavaScript调用Model中的方法是实现MVC架构的重要环节之一。
本文将结合具体案例,介绍如何使用JavaScript调用Model中的方法。
我们需要了解MVC模式中各个部分的职责。
模型(Model)负责处理应用程序的数据和业务逻辑,视图(View)负责展示数据给用户,控制器(Controller)负责处理用户的输入和控制数据流动。
在JavaScript中,我们可以通过创建一个Model对象来实现模型的功能。
模型对象中可以包含各种属性和方法,用于处理数据和业务逻辑。
接下来,我们将以一个简单的购物车功能为例,演示如何调用Model中的方法。
假设我们的购物车中有以下几个商品:```javascriptvar products = [{ id: 1, name: 'iPhone 12', price: 6999 },{ id: 2, name: 'iPad Pro', price: 8999 },{ id: 3, name: 'AirPods Pro', price: 1799 }];```我们需要创建一个购物车的模型对象:```javascriptvar cartModel = {items: [],total: 0,addItem: function(productId) {var product = products.find(function(item) {return item.id === productId;});if (product) {this.items.push(product);this.total += product.price;}},removeItem: function(productId) {var index = this.items.findIndex(function(item) { return item.id === productId;});if (index !== -1) {var product = this.items.splice(index, 1)[0];this.total -= product.price;}},clearCart: function() {this.items = [];this.total = 0;}};```在上面的代码中,我们定义了一个cartModel对象,它包含了购物车的商品列表(items)、总价(total)以及添加商品(addItem)、删除商品(removeItem)和清空购物车(clearCart)等方法。
基于JavaScript的在线购物系统的设计与实现一、引言随着互联网的快速发展,电子商务已经成为人们日常生活中不可或缺的一部分。
在线购物系统作为电子商务的重要组成部分,承载着消费者与商家之间的交易活动。
本文将介绍基于JavaScript的在线购物系统的设计与实现,包括系统架构、功能模块、技术选型等方面的内容。
二、系统架构设计在线购物系统的架构设计是整个系统开发过程中至关重要的一环。
在基于JavaScript的在线购物系统中,通常采用前后端分离的架构,前端使用Vue.js或React.js等框架进行开发,后端使用Node.js或Java等语言进行开发。
前后端通过API接口进行数据交互,实现数据的传输和展示。
三、功能模块设计用户模块:包括用户注册、登录、个人信息管理等功能。
商品模块:包括商品分类、商品列表展示、商品详情页等功能。
购物车模块:用户可以将商品加入购物车,对购物车中的商品进行管理。
订单模块:用户可以生成订单、查看订单状态、对订单进行支付等操作。
支付模块:集成第三方支付接口,实现用户支付功能。
后台管理模块:管理员可以对商品信息、订单信息进行管理和统计。
四、技术选型前端技术:使用Vue.js框架进行前端页面开发,采用Element UI或Ant Design等UI组件库提升开发效率和页面美观度。
后端技术:使用Node.js搭建后端服务,Express.js或Koa.js 作为后端框架,MongoDB或MySQL作为数据库存储。
数据交互:前后端通过RESTful API接口进行数据传输,使用Axios或Fetch等工具进行数据请求和响应处理。
安全性考虑:采用HTTPS协议保障数据传输安全,对用户密码进行加密存储,防止信息泄露。
五、系统实现步骤搭建前端项目:使用Vue CLI创建项目结构,编写页面组件和路由配置。
设计数据库结构:根据业务需求设计数据库表结构,建立商品表、用户表、订单表等。
开发后端接口:编写RESTful API接口,实现前后端数据交互和业务逻辑处理。
JAVASCRIPT初学者及参考必备JavaScript初学者及参考必备:JavaScript学习指南(第2版)JavaScript:The Definitive Guide,6th Edition(JavaScript权威指南第6版)PDF+epub JavaScript权威指南(第5版)中⽂版|英⽂版+随书源代码|第4版英⽂版| JavaScript⾼级程序设计(第2版)中⽂版JavaScript Bible,7th Edition(JavaScript宝典第7版)JavaScript宝典(第6版)中⽂版|英⽂版JavaScript⼊门经典(第3版)中⽂⾼清PDF下载JavaScript语⾔精粹⾼清PDF中⽂版|英⽂chm版|英⽂pdf版JavaScript开发技术⼤全JavaScript&DHTML Cookbook中⽂版(第2版)JavaScript捷径教程JavaScript实战(Practical JavaScript,DOM Scripting,and Ajax Projects)中⽂版JavaScript DOM⾼级程序设计(中⽂版⾼清PDF 下载)ppk谈JavaScript(中⽂⾼清PDF)JavaScript设计模式(Pro JavaScript Design Patterns)中⽂版JavaScript模式JavaScript王者归来Javascript Bible Golden Edition(JavaScript⾦典)JavaScript The Complete Reference(JavaScript技术⼤全)Advanced Javascript,3rd Edition(JavaScript⾼级编程)JavaScript Examples Bible(JavaScript实例宝典)Wrox Beginning JavaScript(第三版)Professional JavaScript for Web DevelopersO'Reilly Head First JavascriptPro Javascript RIA Techniques:Best Practices,Performance and PresentationJScript中⽂参考⼿册Javascript程序员字典Special Edition Using JavaScriptObject Oriented JavaScriptO'Reilly JavaScript PatternsJavaScript DOM编程艺术第⼀版中英⽂|第⼆版英⽂JavaScript与Jscript从⼊门到精通The.Pragmatic.Bookshelf开发丛书-JavaScript实⽤指南.Pragmatic.Guide.to.JavaScript.Christophe.Porteneuve.⽂字版精通JavaScript(图灵计算机科学丛书)程序员常⽤JavaScript特效/doc/1b12378266.html2.0Demystifiedw3school.Javascript特效⼤全(上册)High Performance JavaScript(中英⽂对照版)CSS&javascript动态⽹页设计与制作JavaScript使⽤⼿册.rarJavaScript⽹页特效范例宝典|源码实⽤JavaScript⽹页特效编程百宝箱JavaScript客户端验证和页⾯特效制作JavaScript框架(JavaScript/Ajax Frameworks):jQuery基础教程(第2版)中⽂⾼清PDF下载|英⽂版jQuery实战(jQuery in Action)中⽂⾼清PDF下载|英⽂版锋利的jQueryjQuery基础教程中⽂⾼清PDF版jQuery攻略(jQuery Recipes:A Problem Solution Approach)中⽂PDF|英⽂版15天学会jQuery(PDF中⽂版)O'Reilly jQuery Pocket ReferencejQuery Reference GuidejQuery1.4Plugin Development Beginner's GuidejQuery1.2API全中⽂jQuery中英⽂对照⼿册jQuery:Visual QuickStart GuideExt JS in ActionPrototype and Scriptaculous in ActionPrototype and /doc/1b12378266.html精通Dojo中⽂版PDFDojo:The Definitive Guide—Dojo权威指南Mastering Dojo:JavaScript and Ajax Tools for Great Web ExperiencesApress Practical Dojo ProjectsDojo:Using the Dojo JavaScript Library to Build Ajax Applications Mastering Dojo:JavaScript and Ajax Tools for Great Web Experiences Apress MooTools EssentialsBeginning Google Web Toolkit:From Novice to ProfessionaljQuery开发视频教程jQuery Projects:Creating an Interactive Photo Gallery Pro Android Web Apps:Develop for Android using HTML5,CSS3&JavaScript Building.iPhone.Apps.with.HTML,CSS,and.JavaScriptAJAX(Asynchronous JavaScript and XML):AJAX完全⼿册(AJAX:The Complete Reference)中⽂版PDF下载Wiley AJAX Bible(Ajax宝典)MANNING AJAX In ActionAjax基础教程XMLHttpRequest中⽂参考⼿册征服Ajax Web2.0开发详解Wrox Beginning AjaxWrox Professional Ajax,2nd Edition(Ajax⾼级编程)Wrox Professional Rich Internet Applications AJAX and BeyondO'Reilly Ajax:The Definitive Guide(Ajax权威指南)Beginning Javascript with DOM Scripting and Ajax从⼊门到精通Accelerated DOM Scripting with Ajax,APIs,and Libraries Ajax Patterns and Best PracticesHead Rush AjaxO'Reilly Ajax HacksO'Reilly Adding AjaxPractical JavaScript DOM Scripting and Ajax Projects Ajax-A New Approach to Web ApplicationsSEO:Search Engine Optimization BibleAJAX基础教程AJAX Essential Training视频教程系列。
【Javascript设计模式1】-单例模式《parctical common lisp》的作者曾说,如果你需要一种模式,那一定是哪里出了问题。
他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案。
不管是弱类型或强类型,静态或动态语言,命令式或说明式语言、每种语言都有天生的优缺点。
一个牙买加运动员,在短跑甚至拳击方面有一些优势,在练瑜伽上就欠缺一些。
术士和暗影牧师很容易成为一个出色的辅助,而一个背着梅肯满地图飞的敌法就会略显尴尬。
换到程序中, 静态语言里可能需要花很多功夫来实现装饰者,而js由于能随时往对象上面扔方法,以至于装饰者模式在js里成了鸡肋。
讲javascript设计模式的书还比较少. Pro javaScript Design Patterns.是比较经典的一本,但是它里面的例子举得比较啰嗦,所以结合我在工作中写过的代码,把我的理解总结一下。
如果我的理解出现了偏差,请不吝指正。
一单例模式单例模式的定义是产生一个类的唯一实例,但js本身是一种“无类”语言。
很多讲js设计模式的文章把{}当成一个单例来使用也勉强说得通。
因为js生成对象的方式有很多种,我们来看下另一种更有意义的单例。
有这样一个常见的需求,点击某个按钮的时候需要在页面弹出一个遮罩层。
比如点击登录的时候.这个生成灰色背景遮罩层的代码是很好写的.问题是, 这个遮罩层是全局唯一的, 那么每次调用createMask都会创建一个新的div, 虽然可以在隐藏遮罩层的把它remove掉. 但显然这样做不合理.再看下第二种方案, 在页面的一开始就创建好这个div. 然后用一个变量引用它.这样确实在页面只会创建一个遮罩层div, 但是另外一个问题随之而来, 也许我们永远都不需要这个遮罩层, 那又浪费掉一个div, 对dom节点的任何操作都应该非常吝啬.如果可以借助一个变量. 来判断是否已经创建过div呢?看起来不错, 到这里的确完成了一个产生单列对象的函数. 我们再仔细看这段代码有什么不妥.首先这个函数是存在一定副作用的, 函数体内改变了外界变量mask的引用, 在多人协作的项目中, createMask是个不安全的函数. 另一方面, mask这个全局变量并不是非需不可. 再来改进一下.用了个简单的闭包把变量mask包起来, 至少对于createMask函数来讲, 它是封闭的.可能看到这里, 会觉得单例模式也太简单了. 的确一些设计模式都是非常简单的, 即使从没关注过设计模式的概念, 在平时的代码中也不知不觉用到了一些设计模式. 就像多年前我明白老汉推车是什么回事的时候也想过尼玛原来这就是老汉推车.GOF里的23种设计模式, 也是在软件开发中早就存在并反复使用的模式. 如果程序员没有明确意识到他使用过某些模式, 那么下次他也许会错过更合适的设计 (这段话来自《松本行弘的程序世界》).再回来正题, 前面那个单例还是有缺点. 它只能用于创建遮罩层. 假如我又需要写一个函数, 用来创建一个唯一的xhr对象呢? 能不能找到一个通用的singleton包装器.js中函数是第一型, 意味着函数也可以当参数传递. 看看最终的代码.用一个变量来保存第一次的返回值, 如果它已经被赋值过, 那么在以后的调用中优先返回该变量. 而真正创建遮罩层的代码是通过回调函数的方式传人到singleton包装器中的. 这种方式其实叫桥接模式. 关于桥接模式, 放在后面一点点来说.然而singleton函数也不是完美的, 它始终还是需要一个变量result来寄存div的引用. 遗憾的是js的函数式特性还不足以完全的消除声明和语句.【Javascript设计模式2】-简单工厂模式简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定,而是在执行期决定的情况。
说的通俗点,就像公司茶水间的饮料机,要咖啡还是牛奶取决于你按哪个按钮。
简单工厂模式在创建ajax对象的时候也非常有用.之前我写了一个处理ajax异步嵌套的库,地址在https:///AlloyTeam/DanceRequest这个库里提供了几种ajax请求的方式,包括xhr对象的get, post, 也包括跨域用的jsonp和iframe. 为了方便使用, 这几种方式都抽象到了同一个接口里面.Request实际上就是一个工厂方法, 至于到底是产生xhr的实例, 还是jsonp 的实例. 是由后来的代码决定的。
实际上在js里面,所谓的构造函数也是一个简单工厂。
只是批了一件new的衣服. 我们扒掉这件衣服看看里面。
通过这段代码, 在firefox, chrome等浏览器里,可以完美模拟new.这段代码来自es5的new和构造器的相关说明,可以看到,所谓的new,本身只是一个对象的复制和改写过程,而具体会生成什么是由调用ObjectFactory 时传进去的参数所决定的。
【Javascript设计模式3】-观察者模式观察者模式( 又叫发布者-订阅者模式 )应该是最常用的模式之一. 在很多语言里都得到大量应用. 包括我们平时接触的dom事件. 也是js和dom之间实现的一种观察者模式.只要订阅了div的click事件. 当点击div的时候, function click就会被触发.那么到底什么是观察者模式呢. 先看看生活中的观察者模式。
好莱坞有句名言. “不要给我打电话,我会给你打电话”. 这句话就解释了一个观察者模式的来龙去脉。
其中“我”是发布者,“你”是订阅者。
再举个例子,我来公司面试的时候,完事之后每个面试官都会对我说:“请留下你的联系方式,有消息我们会通知你”。
在这里“我”是订阅者,面试官是发布者。
所以我不用每天或者每小时都去询问面试结果,通讯的主动权掌握在了面试官手上。
而我只需要提供一个联系方式。
观察者模式可以很好的实现2个模块之间的解耦。
假如我正在一个团队里开发一个html5游戏. 当游戏开始的时候,需要加载一些图片素材。
加载好这些图片之后开始才执行游戏逻辑. 假设这是一个需要多人合作的项目. 我完成了Gamer和Map模块, 而我的同事A写了一个图片加载器loadImage.loadImage的代码如下当图片加载好之后, 再渲染地图, 执行游戏逻辑. 嗯, 这个程序运行良好. 突然有一天, 我想起应该给游戏加上声音功能. 我应该让图片加载器添上一行代码.可是写这个模块的同事A去了外地旅游. 于是我打电话给他, 喂. 你的loadImage函数在哪, 我能不能改一下, 改了之后有没有副作用. 如你所想, 各种不淡定的事发生了. 如果当初我们能这样写呢:loadImage完成之后, 它根本不关心将来会发生什么, 因为它的工作已经完成了. 接下来它只要发布一个信号.loadImage.trigger( ”ready’ );那么监听了loadImage的’ready’事件的对象都会收到通知. 就像上个面试的例子. 面试官根本不关心面试者们收到面试结果后会去哪吃饭. 他只负责把面试者的简历搜集到一起. 当面试结果出来时照着简历上的电话挨个通知.说了这么多概念, 来一个具体的实现. 实现过程其实很简单. 面试者把简历扔到一个盒子里,然后面试官在合适的时机拿着盒子里的简历挨个打电话通知结果.最后用观察者模式来做一个成人电视台的小应用.//订阅者【Javascript设计模式4】-适配器模式去年年前当时正在开发, 有个存储应用分类id的js文件, 分类id的结构最开始设计的比较笨重. 于是我决定重构它. 我把它定义成一个json 树的形式, 大概是这样:里大概有4,5个页面都调用这个category对象. 春节前我休了1个星期假. 过年来之后发现邮箱里有封邮件, 设计数据库的同学把category..js也重构了一份, 并且其他几个项目里都是用了这份category.js, 我拿过来一看就傻眼了, 和我之前定的数据结构完全不一样.当然这是一个沟通上的反面例子. 但接下来的重点是我已经在N个文件里用到了之前我定的category.js. 而且惹上了一些复杂的相关逻辑. 怎么改掉我之前的代码呢. 全部重写肯定是不愿意. 所以现在适配器就派上用场了.只需要把同事的category用一个函数转成跟我之前定义的一样.适配器模式的作用很像一个转接口. 本来iphone的充电器是不能直接插在电脑机箱上的, 而通过一个usb转接口就可以了.所以, 在程序里适配器模式也经常用来适配2个接口, 比如你现在正在用一个自定义的js库. 里面有个根据id获取节点的方法$id(). 有天你觉得jquery里的$实现得更酷, 但你又不想让你的工程师去学习新的库和语法. 那一个适配器就能让你完成这件事情.【Javascript设计模式5】-代理模式代理模式的定义是把对一个对象的访问, 交给另一个代理对象来操作.举一个例子, 我在追一个MM想给她送一束花,但是我因为我性格比较腼腆,所以我托付了MM的一个好朋友来送。
这个例子不是非常好,至少我们没看出代理模式有什么大的用处,因为追MM更好的方式是送一台宝马。
再举个例子,假如我每天都得写工作日报( 其实没有这么惨 ). 我的日报最后会让总监审阅. 如果我们都直接把日报发给总监 , 那可能总监就没法工作了. 所以通常的做法是把日报发给我的组长,组长把所有组员一周的日报都汇总后再发给总监 .实际的编程中,这种因为性能问题使用代理模式的机会是非常多的。
比如频繁的访问dom节点, 频繁的请求远程资源. 可以把操作先存到一个缓冲区, 然后自己选择真正的触发时机.再来个详细的例子,之前我写了一个街头霸王的游戏, 地址在/StreetFighter/游戏中隆需要接受键盘的事件, 来完成相应动作.于是我写了一个keyManage类. 其中在游戏主线程里监听keyManage的变化.图片里面隆正在放升龙拳, 升龙拳的操作是前下前+拳. 但是这个keyManage类只要发生键盘事件就会触发之前监听的change函数. 这意味着永远只能取得前,后,前,拳这样单独的按键事件,而无法得到一个按键组合。
好吧,我决定改写我的keyManage类, 让它也支持传递按键组合. 但是如果我以后写个html5版双截龙,意味着我每次都得改写keyManage. 我总是觉得, 这种函数应该可以抽象成一个更底层的方法, 让任何游戏都可以用上它.所以最后的keyManage只负责映射键盘事件. 而隆接受到的动作是通过一个代理对象处理之后的.至于proxy里面怎么实现,完全可以自由发挥。
还有个例子就是在调用ajax请求的时候,无论是各种开源库,还是自己写的Ajax 类, 都会给xhr对象设置一个代理. 我们不可能频繁的去操作xhr对象发请求, 而应该是这样.【Javascript设计模式6】-桥接模式桥接模式的作用在于将实现部分和抽象部分分离开来,以便两者可以独立的变化。