阅读本文约需要6分钟

大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈)。上次老师跟大家分享了JS 之经典实例的知识,今天跟大家分享下JS 之设计模式的知识。

1 JS 之设计模式设计模式的定义:在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案当然我们可以用一个通俗的说法:设计模式是解决某个特定场景下对某种问题的解决方案。因此,当我们遇到合适的场景时,我们可能会条件反射一样自然而然想到符合这种场景的设计模式。比如,当系统中某个接口的结构已经无法满足我们现在的业务需求,但又不能改动这个接口,因为可能原来的系统很多功能都依赖于这个接口,改动接口会牵扯到太多文件。因此应对这种场景,我们可以很快地想到可以用适配器模式来解决这个问题。下面介绍几种在JavaScript中常见的几种设计模式:1、单例模式单例模式的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。实现的方法为先判断实例存在与否,如果存在则直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象。适用场景:一个单一对象。比如:弹窗,无论点击多少次,弹窗只应该被创建一次。

class CreateUser {    constructor(name) {        this.name = name;        this.getName();    }    getName() {         return this.name;    }}// 代理实现单例模式var ProxyMode = (function() {    var instance = null;    return function(name) {        if(!instance) {            instance = new CreateUser(name);        }        return instance;    }})();// 测试单体模式的实例var a = new ProxyMode("aaa");var b = new ProxyMode("bbb");// 因为单体模式是只实例化一次,所以下面的实例是相等的console.log(a === b);    //true

2、策略模式策略模式的定义:定义一系列的算法,把他们一个个封装起来,并且使他们可以相互替换。策略模式的目的就是将算法的使用算法的实现分离开来。一个基于策略模式的程序至少由两部分组成。第一个部分是一组策略类(可变),策略类封装了具体的算法,并负责具体的计算过程。第二个部分是环境类Context(不变),Context接受客户的请求,随后将请求委托给某一个策略类。要做到这一点,说明Context中要维持对某个策略对象的引用。

/*策略类*/var levelOBJ = {    "A": function(money) {        return money * 4;    },    "B" : function(money) {        return money * 3;    },    "C" : function(money) {        return money * 2;    } };/*环境类*/var calculateBouns =function(level,money) {    return levelOBJ[level](money);};console.log(calculateBouns('A',10000)); // 40000

3、代理模式代理模式的定义:为一个对象提供一个代用品或占位符,以便控制对它的访问。常用的虚拟代理形式:某一个花销很大的操作,可以通过虚拟代理的方式延迟到这种需要它的时候才去创建(例:使用虚拟代理实现图片懒加载)图片懒加载的方式:先通过一张loading图占位,然后通过异步的方式加载图片,等图片加载好了再把完成的图片加载到img标签里面。

var imgFunc = (function() {    var imgNode = document.createElement('img');    document.body.appendChild(imgNode);    return {        setSrc: function(src) {            imgNode.src = src;        }    }})();var proxyImage = (function() {    var img = new Image();    img.onload = function() {        imgFunc.setSrc(this.src);    }    return {        setSrc: function(src) {            imgFunc.setSrc('./loading,gif');            img.src = src;        }    }})();proxyImage.setSrc('./pic.png');

使用代理模式实现图片懒加载的优点还有符合单一职责原则。减少一个类或方法的粒度和耦合度。4、中介者模式中介者模式的定义:通过一个中介者对象,其他所有的相关对象都通过该中介者对象来通信,而不是相互引用,当其中的一个对象发生改变时,只需要通知中介者对象即可。通过中介者模式可以解除对象与对象之间的紧耦合关系。例如:现实生活中,航线上的飞机只需要和机场的塔台通信就能确定航线和飞行状态,而不需要和所有飞机通信。同时塔台作为中介者,知道每架飞机的飞行状态,所以可以安排所有飞机的起降和航线安排。中介者模式适用的场景:例如购物车需求,存在商品选择表单、颜色选择表单、购买数量表单等等,都会触发change事件,那么可以通过中介者来转发处理这些事件,实现各个事件间的解耦,仅仅维护中介者对象即可。

var goods = {   //手机库存    'red|32G': 3,    'red|64G': 1,    'blue|32G': 7,    'blue|32G': 6,};//中介者var mediator = (function() {    var colorSelect = document.getElementById('colorSelect');    var memorySelect = document.getElementById('memorySelect');    var numSelect = document.getElementById('numSelect');    return {        changed: function(obj) {            switch(obj){                case colorSelect:                    //TODO                    break;                case memorySelect:                    //TODO                    break;                case numSelect:                    //TODO                    break;            }        }    }})();colorSelect.onchange = function() {    mediator.changed(this);};memorySelect.onchange = function() {    mediator.changed(this);};numSelect.onchange = function() {    mediator.changed(this);};

5、装饰者模式装饰者模式的定义:在不改变对象自身的基础上,在程序运行期间给对象动态地添加方法。例如:现有4种型号的自行车分别被定义成一个单独的类,如果给每辆自行车都加上前灯、尾灯、铃铛这3个配件,如果用类继承的方式,需要创建4*3=12个子类。但如果通过装饰者模式,只需要创建3个类。装饰者模式适用的场景:原有方法维持不变,在原有方法上再挂载其他方法来满足现有需求;函数的解耦,将函数拆分成多个可复用的函数,再将拆分出来的函数挂载到某个函数上,实现相同的效果但增强了复用性。例:用AOP装饰函数实现装饰者模式.

Function.prototype.before = function(beforefn) {    var self = this;    //保存原函数引用    return function(){  //返回包含了原函数和新函数的 '代理函数'        beforefn.apply(this, arguments);    //执行新函数,修正this        return self.apply(this,arguments);  //执行原函数    }}Function.prototype.after = function(afterfn) {    var self = this;    return function(){        var ret = self.apply(this,arguments);        afterfn.apply(this, arguments);        return ret;    }}var func = function() {    console.log('2');}//func1和func3为挂载函数var func1 = function() {    console.log('1');}var func3 = function() {    console.log('3');}func = func.before(func1).after(func3);func();
参考来源:https://juejin.im/post/59df4f74f265da430f311909

今天就分享这么多,JS 之设计模式学会了多少欢迎在留言区评论,对于有价值的留言,我们都会一一回复的。如果觉得文章对你有一丢丢帮助,请点右下角【在看】,让更多人看到该文章。

js 改变change方法_JS 之设计模式相关推荐

  1. js 改变change方法_Linux 中改变主机名的 4 种方法 | Linux 中国

    今天,我们将向你展示使用不同的方法来修改主机名.你可以从中选取最适合你的方法.-- Magesh Maruthamuthu 昨天我们已经在我们的网站中写过如何在 Linux 中修改主机名的文章[1]. ...

  2. JS行间改变css的方法,js改变css样式的三种方法推荐

    共用代码: this is a div var div=document.getElementById('div'); 第一种:用cssText div.style.cssText='width:25 ...

  3. html设置数组的方法,js改变原数组的方法有哪些?

    js改变原数组的方法 1.pop() pop():删除 arrayObject 的最后一个元素,把数组长度减 1,并且返回它删除的元素的值.如果数组已经为空,则 pop() 不 改变数组,并返回 un ...

  4. 用JQuery或JS改变div的id的五种方法

    div的id是可以改变的,通常使用的方法是通过JQuery或Javascript来实现.本文介绍用JQuery或JS改变div的id的五种方法. 方法一:使用Tag选择器 JQuery代码如下: &l ...

  5. java数组 js数组的长度_js中split()方法得到的数组长度问题

    定义和用法 split() 方法用于把一个字符串分割成字符串数组. 语法 stringObject.split(separator,howmany) 参数 描述 separator 必需.字符串或正则 ...

  6. class 原生js获取父元素_JS获取节点的兄弟,父级,子级元素的方法

    先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比. JS的方法会比JQUERY麻烦很多,主要则是因为FF浏览器,FF浏览器会把你的换行也当最DOM元素 原生的J ...

  7. 重学前端第一阶段完 钢琴项目(document.querySelector js改变css样式的3种方式 思路 成品)

    菜鸟学完之后,总是感觉学了也还是不会,主要就是因为没有实践,不知道自己到底哪里有问题!虽然说我还没复习完,前端很大一部分都处于模糊阶段,但是感觉还是应该先尽力做一个简单的东西,把这几天学的都用进去,遇 ...

  8. js改变style样式和css样式

    js可实现用户对页面中的选择条件改变页面中的样式,页面样式可以通过style修饰,也可以通过css修饰,先来看一下js改变style样式,代码如下: [html] view plaincopy < ...

  9. js 浅拷贝直接赋值_js 深拷贝 vs 浅拷贝

    本文主要讲一下 js 的基本数据类型以及一些堆和栈的知识和什么是深拷贝.什么是浅拷贝.深拷贝与浅拷贝的区别,以及怎么进行深拷贝和怎么进行浅拷贝. 本文思维导图如下:本文思维导图 堆和栈的区别 其实深拷 ...

最新文章

  1. 教你搞定Android自定义View
  2. python多线程编程: 条件变量同步
  3. 进程中dll模块的隐藏
  4. 判断浏览器是否为IE内核的最简单的方法
  5. Windows Hook(2)调用DLL函数
  6. 【软件工程】交付后维护
  7. HTML期末学生大作业-乒乓球网页作业html+css+javascript
  8. nginx php-cgi php
  9. c语言以空格分割字符串_如何统计字符串中单词的个数?
  10. [转载] Java基础之构造方法(函数)何时被调用
  11. 全自动高清录播服务器,全自动高清录播服务器 高清录播系统 一体化操作;易使用 操作简便...
  12. mysql多线程访问总结
  13. c#string类型探讨
  14. 后端Web开发框架(Java)
  15. 显示风场的某一局部区域,实现多分辨率
  16. html背景色坐标,【已解决】Html的Canvas设置全局背景色
  17. 3-11 三天打渔、两天晒网 - 实验7 简单的循环程序 - 《Python编程基础及应用实验教程》(高等教育出版社)
  18. 计算机网络nic,NIC,什么是NIC,NIC介绍--电子百科词库--科通芯城,IC及其他电子元器件交易型电商平台100%正品保证...
  19. 二分查找总结——左闭右开区间和左闭右闭区间(C++语言)
  20. 数仓--拉链表实战⭐⭐⭐⭐⭐

热门文章

  1. Linux下du加强版,灵活快速定位硬盘使用情况,无需安装
  2. 使用json-lib实现json to javabean
  3. 请妥善保管自己的QQ等网络帐号
  4. OpenCV 脸部跟踪(1)
  5. 项目视频光盘项目中所学概览-html5+批处理+bat转exe
  6. 页面如何自动出现滚动条(overflow属性用法)
  7. fckeditor的jsp中的使用
  8. .Net Compact Framework实现文件下载功能
  9. 使用java+TestNG进行接口回归测试
  10. linux系统硬盘表识