javascript设计模式-应用示例

事件工具类

/* addEvent: simplified event attachment */
function addEvent( obj, type, fn ) {if (obj.addEventListener) {obj.addEventListener( type, fn, false );EventCache.add(obj, type, fn);}else if (obj.attachEvent) {obj["e"+type+fn] = fn;obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }obj.attachEvent( "on"+type, obj[type+fn] );EventCache.add(obj, type, fn);}else {obj["on"+type] = obj["e"+type+fn];}
}var EventCache = function(){var listEvents = [];return {listEvents : listEvents,add : function(node, sEventName, fHandler){listEvents.push(arguments);},flush : function(){var i, item;for(i = listEvents.length - 1; i >= 0; i = i - 1){item = listEvents[i];if(item[0].removeEventListener){item[0].removeEventListener(item[1], item[2], item[3]);};if(item[1].substring(0, 2) != "on"){item[1] = "on" + item[1];};if(item[0].detachEvent){item[0].detachEvent(item[1], item[2]);};item[0][item[1]] = null;};}};
}();
addEvent(window,’unload',EventCache.flush);
/* window 'load' attachment */
function addLoadEvent(func) {var oldonload = window.onload;if (typeof window.onload != 'function') {window.onload = func;}else {window.onload = function() {oldonload();func();}}
}

JS劫持操作—模拟JS验证框架(单例应用)

GiantCorp.RegPage = {FORM_ID: 'reg-form',OUTPUT_ID: 'reg-results',// Form handling methods.handleSubmit: function(e) {e.preventDefault(); // Stop the normal form submission.var data = {};var inputs = GiantCorp.RegPage.formEl.getElementsByTagName('input');for(var i = 0, len = inputs.length; i < len; i++) {data[inputs[i].name] = inputs[i].value;}GiantCorp.RegPage.sendRegistration(data);},sendRegistration: function(data) {// Make an XHR request and call displayResult() when the response is},displayResult: function(response) {GiantCorp.RegPage.outputEl.innerHTML = response;},// Initialization method.init: function() {// Get the form and output elements.GiantCorp.RegPage.formEl = $(GiantCorp.RegPage.FORM_ID);GiantCorp.RegPage.outputEl = $(GiantCorp.RegPage.OUTPUT_ID);// Hijack the form submission.addEvent(GiantCorp.RegPage.formEl, 'submit', GiantCorp.RegPage.handleSubmit);}
};// Invoke the initialization method after the page loads.
addLoadEvent(GiantCorp.RegPage.init);

运行过程中动态改变类实现(工厂应用)

有些时候为了适应没的场景,有些代码没必要每次调用时都进行一次环境判断,所以可以memoizing技术动态改写运行中代码的实现。

createXhrObject: function() { // Factory method.var methods = [function () {return new XMLHttpRequest();},function () {return new ActiveXObject('Msxml2.XMLHTTP');}];for (var i = 0, len = methods.length; i < len; i++) {try {methods[i]();}catch (e) {continue;}//如果得到与环境相同的合法参数,就改变函数的内容,下面两条语句任选其一this.createXhrObject = methods[i]; // Memoize the method.//this.constructor.prototype.createXhrObject = methods[i];return methods[i];}
}

请求序列—工厂应用

发起多个请求,程序会自动缓存,并通过setTimeOut重复调用。

var myHandler = XhrManager.createXhrHandler();
var callback = {success: function(responseText) { alert('Success: ' + responseText); },failure: function(statusCode) { alert('Failure: ' + statusCode); }
};
myHandler.request('GET', 'script.php', callback);var XhrManager = {createXhrHandler: function() {var xhr;if(this.isOffline()) {xhr = new OfflineHandler();}else if(this.isHighLatency()) {xhr = new QueuedHandler();}else {xhr = new SimpleHandler()}Interface.ensureImplements(xhr, AjaxHandler);return xhr},isOffline: function() { // Do a quick request with SimpleHandler and see if},isHighLatency: function() {//检查请求所经历的时间,根据时间长短来判断请求成功与否}
};var AjaxHandler = new Interface('AjaxHandler', ['request', 'createXhrObject']);/* SimpleHandler class. */
var SimpleHandler = function() {}; // implements AjaxHandler
SimpleHandler.prototype = {request: function(method, url, callback, postVars) {var xhr = this.createXhrObject();xhr.onreadystatechange = function() {if(xhr.readyState !== 4) return;(xhr.status === 200) ?callback.success(xhr.responseText, xhr.responseXML) :callback.failure(xhr.status);};xhr.open(method, url, true);if(method !== 'POST') postVars = null;xhr.send(postVars);},createXhrObject: function() { // Factory method.var methods = [function() { return new XMLHttpRequest(); },function() { return new ActiveXObject('Msxml2.XMLHTTP'); },function() { return new ActiveXObject('Microsoft.XMLHTTP'); }];for(var i = 0, len = methods.length; i < len; i++) {try {methods[i]();}catch(e) {continue;}this.createXhrObject = methods[i];return methods[i];}throw new Error('SimpleHandler: Could not create an XHR object.');}
};/* 用户处于离线状态时会把所有请求缓存起来. */
var OfflineHandler = function() { // implements AjaxHandlerthis.storedRequests = [];
};
extend(OfflineHandler, SimpleHandler);
OfflineHandler.prototype.request = function(method, url, callback, postVars) {if(XhrManager.isOffline()) { // Store the requests until we are online.this.storedRequests.push({method: method,url: url,callback: callback,postVars: postVars});}else { // Call SimpleHandler's request method if we are online.this.flushStoredRequests();OfflineHandler.superclass.request(method, url, callback, postVars);}
};
OfflineHandler.prototype.flushStoredRequests = function() {for(var i = 0, len = storedRequests.length; i < len; i++) {var req = storedRequests[i];OfflineHandler.superclass.request(req.method, req.url, req.callback,req.postVars);}
};/* 在发起新请求之前确保所有的请求都已成功处理. 如果有未完成的或有正在处理的则在请定时间后再调用*/
var QueuedHandler = function() { // implements AjaxHandlerthis.queue = [];this.requestInProgress = false;this.retryDelay = 5; // In seconds.
};
extend(QueuedHandler, SimpleHandler);
QueuedHandler.prototype.request = function(method, url, callback, postVars,override) {if(this.requestInProgress && !override) {this.queue.push({method: method,url: url,callback: callback,postVars: postVars});}else {this.requestInProgress = true;var xhr = this.createXhrObject();var that = this;xhr.onreadystatechange = function() {if(xhr.readyState !== 4) return;if(xhr.status === 200) {callback.success(xhr.responseText, xhr.responseXML);that.advanceQueue();}else {callback.failure(xhr.status);setTimeout(function() { that.request(method, url, callback, postVars); },that.retryDelay * 1000);}};xhr.open(method, url, true);if(method !== 'POST') postVars = null;xhr.send(postVars);}
};
QueuedHandler.prototype.advanceQueue = function() {if(this.queue.length === 0) {this.requestInProgress = false;return;}var req = this.queue.shift();this.request(req.method, req.url, req.callback, req.postVars, true);
};

性能检查器—装饰应用

这个例子充分应用了通道方法,利用此模式应该可以做到AOP的功能。

var ListBuilder = function(parent, listLength) {this.parentEl = document.createElement(parent);this.listLength = listLength;
};ListBuilder.prototype = {buildList: function() {var list = document.createElement('ol');this.parentEl.appendChild(list);for(var i = 0; i < this.listLength; i++) {var item = document.createElement('li');list.appendChild(item);}}
};var MethodProfiler = function(component) {this.component = component;this.timers = {};for(var key in this.component) {// Ensure that the property is a function.if(typeof this.component[key] !== 'function') {continue;}// Add the method.var that = this;(function(methodName) {that[methodName] = function() {that.startTimer(methodName);var returnValue = that.component[methodName].apply(that.component,arguments);that.displayTime(methodName, that.getElapsedTime(methodName));return returnValue;};})(key); }
};
MethodProfiler.prototype = {startTimer: function(methodName) {this.timers[methodName] = (new Date()).getTime();},getElapsedTime: function(methodName) {return (new Date()).getTime() - this.timers[methodName];},displayTime: function(methodName, time) {console.log(methodName + ': ' + time + ' ms');}
};var list = new ListBuilder('list-container', 5000);
list = new MethodProfiler(list);//装饰者应用
list.buildList('ol'); // Displays "buildList: 301 ms".
list.buildList('ul'); // Displays "buildList: 287 ms".
list.removeLists('ul'); // 未实现,如果有此方法则会自动计算时间.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/639398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【WSL】[出现错误 2147944320 (0x80070780) (启动“ubuntu.exe”时)]

问题描述 在尝试启动 Windows Subsystem for Linux (WSL) 的 “ubuntu.exe” 时&#xff0c;可能会遇到以下错误&#xff1a; [出现错误 2147944320 (0x80070780) (启动“ubuntu.exe”时)]错误的截图如下&#xff1a; 原因分析 系统找不到指定的文件。在这种情况下&#xff…

Git提交 ssh: connect to host github.com port 22: Connection timed out解决方案

你们好&#xff0c;我是金金金。 场景 之前都是好好的&#xff0c;不知道今天为什么提交代码就这样了 排查 根据英文可以看出&#xff0c;ssh端口号被拒绝了&#xff0c;22号端口不行&#xff0c;那就换一个端口 造成error的原因 ssh端口被拒绝 解决 找到.ssh文件&#xff…

CLion调试Nodejs源码

【环境】 macOS node-v20.11.0源码 CLion 2023.3.2 【1】下载源码 https://nodejs.org/en/download/ 【2】编译源码 解压后的目录如下 进入解压后的目录进行编译 ./configure --debug make -C out BUILDTYPEDebug -j 4需要好久… 编译成功之后在node-v20.11.0目录下会有一个…

【Web实操11】定位实操_照片墙(无序摆放)

设置一个板块&#xff0c;将照片随意无序摆放在墙上&#xff0c;从而形成照片墙。本来效果应该是很唯美好看的&#xff0c;就像这种&#xff0c;但是奈何本人手太笨&#xff0c;只好设置能达到照片墙的效果就可。 代码如下&#xff1a; <!DOCTYPE html> <html lang&…

SpringBoot整理-Spring Boot配置

Spring Boot 的配置系统是其核心功能之一,旨在简化 Spring 应用的配置过程。Spring Boot 提供了一种灵活的方式来配置你的应用,无论是通过外部配置文件,环境变量,命令行参数还是在代码中直接配置。以下是关于 Spring Boot 配置的几个重要方面: 配置文件 application.prope…

JavaEE的MVC(Model-View-Controller)设计模式

JavaEE的MVC&#xff08;Model-View-Controller&#xff09;设计模式是一种用于组织和管理Web应用程序的架构模式。MVC模式将应用程序分为三个主要组件&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&#x…

binary_search_tree的介绍与实现(二叉搜索树精美图示详解哦)

二叉搜搜索树 引言二叉搜索树的介绍二叉搜索树的实现框架默认成员函数构造析构赋值重载 InsertR&#xff08;插入&#xff09;EraseR&#xff08;删除&#xff09;SearchR&#xff08;查找&#xff09; 源码概览总结 引言 在C语言部分&#xff0c;我们已经认识了树与二叉树的结…

【嵌入式经验积累】C语言实现傅里叶变换

文章目录 C 语言实现离散傅利叶变换&#xff08;DFT&#xff09;代码如下&#xff1a;C 语言实现快速傅利叶变换&#xff08;FFT&#xff09;&#xff0c;代码如下&#xff1a;分裂基快速傅利叶变换代码如下。实序列快速傅利叶变换&#xff08;一&#xff09;&#xff0c;代码如…

Nginx 实战指南

Nginx 是一款高性能的开源反向代理服务器,也可用作负载均衡器、Web服务器和缓存服务器。本实战指南将带你深入了解 Nginx 的安装、基础配置、高级配置、最佳实践以及性能调优。 步骤 1: 安装 Nginx Ubuntu sudo apt update sudo apt install nginx CentOS sudo yum insta…

python使用分治算法找出出现次数最多的数字

对于给定的一个长度为n的数组nums&#xff0c;需要找出起重工出现次数大于n/2向下取整的元素&#xff0c;假设给定的数组中一定存在符合给定要求的数&#xff0c;例如给定如下的例子&#xff1a; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 添加图片注…

docker使用http_proxy配置代理

钢铁知识库&#xff0c;一个学习python爬虫、数据分析的知识库。人生苦短&#xff0c;快用python。 在内网服务器中&#xff0c;docker经常需要下载拉取镜像&#xff0c;但由于没有网络要么只能手动导入镜像包&#xff0c;又或者通过http_proxy代理到其它服务器下载。 解决方法…

看书标记【R语言数据分析项目精解:理论、方法、实战 9】

看书标记——R语言 Chapter 9 文本挖掘——点评数据展示策略9.1项目背景、目标和方案9.1.1项目背景9.1.2项目目标9.1.3项目方案1.建立评论文本质量量化指标2.建立用户相似度模型3.对用户评论进行情感性分析 9.2项目技术理论简介9.2.1评论文本质量量化指标模型1.主题覆盖量2.评论…

FA-分配行重分配报错【APP-OFA-48313】

FA-重分配行报错 已存在行只能分多次转移调整 Ref1&#xff1a; APP-OFA-48313 You Cannot Create Identical Distribution Lines with Transfer (Doc ID 336894.1) APPLIES TO: Oracle Assets - Version 11.5.10.0 and later Information in this document applies to any…

Ubuntu20 服务器版磁盘扩容

Ubuntu20 服务器版磁盘扩容 Ubuntu20 服务器版磁盘不够用进可以使用fdisk命令对磁盘进行扩容 本案例中是基于vmware虚拟化环境下&#xff0c;ubuntu服务器按默认磁盘大小16G进行安装后&#xff0c;运行一段时间后发面/分区磁盘空间全部用完&#xff0c;导致服务无法正常运行。基…

计算机网络自顶向下Wireshark labs1-Intro

Wireshark labs1 实验文档&#xff1a;http://www-net.cs.umass.edu/wireshark-labs/Wireshark_Intro_v8.0.pdf 介绍 加深对网络协议的理解通常可以通过观察协议的运行和不断调试协议来大大加深&#xff0c;具体而言&#xff0c;就是观察两个协议实体之间交换的报文序列&…

厨艺学习_

选食用油 https://www.bilibili.com/video/BV1oC4y1u799 葵花籽油&#xff1a;万能 玉米油&#xff1a;有香气 菜籽油&#xff1a;又香气&#xff0c;但芥酸高 对三高不好 对老人不好 花生油&#xff1a;不要清炒蔬菜、不能油炸 大豆油&#xff1a;便宜&#xff0c;高温炒…

长虹智能电视 Q2F系列 ZLS59GiQ2机芯 强制刷机升级方法,及刷机升级数据,维修模式进入方法等

适配机芯&#xff1a;ZLS59GiQ2 适配机型&#xff1a;50Q2F、48Q2E、55Q2E、55Q2F、58Q2F、43Q2F、49Q2F、32Q2F 软件强制升级方法&#xff1a; 1、下载后解压&#xff0c;找到upgrade_ZLS59GiQ2_V1.00XXX.bin 、ZLS59GiQ2_mboot.bin复制到U盘根目录&#xff08;不要有任何…

C++ //练习 2.31 假设已有上一个练习中所做的那些声明,则下面的哪些语句是合法的?请说明顶层const和底层const在每个例子中有何体现。

C Primer&#xff08;第5版&#xff09; 练习 2.31 练习 2.31 假设已有上一个练习中所做的那些声明&#xff0c;则下面的哪些语句是合法的&#xff1f;请说明顶层const和底层const在每个例子中有何体现。 r1 v2; p1 p2; p2 p1; p1 p3; p2 p3;环境&#xff1a;Linux Ubun…

React三大属性

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 知…

只会 Python 不行,不会 Python 万万不行 。。。

当下的环境大家有目共睹&#xff0c;未来一段时间情况如何&#xff0c;想必不少人心里也清楚&#xff0c;技术人走到中年&#xff0c;难免会焦虑&#xff0c;职场上干得不爽&#xff0c;但是跳槽也不容易&#xff0c;加上不少企业裁员&#xff0c;换个满意的工作更是难上加难。…