范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

javascript设计模式(JavaScript的7种设计模式)

  javascript设计模式(JavaScript 的 7 种设计模式)
  当启动一个新的项目时候,我们不应该马上开始编程。而是首先应该定义项目的目的和范围,然后列出其功能或规格。如果你已经开始编程或者正在从事一个复杂的项目,则应该选择一个最适合你项目的设计模式。什么是设计模式?
  在软件工程中,设计模式是针对软件设计中常见问题的可重用解决方案。设计模式也是经验丰富的开发人员针对特定问题的最佳实践。它可以被当作编程的模板。为什么要使用设计模式?
  许多工程师要么认为设计模式浪费时间,要么不知道如何恰当的使用设计模式。但如果能正确使用设计模式,则可以帮助你写出更好的可读性更高的代码,并且代码更容易被维护和理解。
  最重要的是,设计模式为软件开发人员提供了通用的词汇表。它们能让学习你代码的人很快了解代码的意图。例如,如果你的项目中使用了装饰器模式,那么新的开发可以很快就知道这段代码的作用,从而他们可以将更多精力放在解决业务问题上,而不是试图理解代码在做什么。
  我们已经知道了什么是设计模式和它的重要性,下面我们深入研究一下 JavaScript 中的 7 种设计模式。一、模块模式
  模块是一段独立的代码,因此我们可以更新模块而不会影响代码的其它部分。模块还允许我们通过为变量创建单独的作用域来避免命名空间污染。当它们与其它代码解耦时,我们还可以在其它项目中重用模块。
  模块是任何现代 JavaScript 应用程序不可或缺的一部分,有助于保持代码干净,独立和有条理。在 JavaScript 中有许多方法可以创建模块,其中一种是模块模式。
  与其它编程语言不同,JavaScript 没有访问修饰符,也就是说,你不能将变量声明为私有的或公共的。因此,模块模式也可用来模拟封装的概念。
  模块模式使用 IIFE(立即调用的函数表达式),闭包和函数作用域来模拟封装的概念。例如:constmyModule=(function(){  constprivateVariable='HelloWorld';  functionprivateMethod(){  console.log(privateVariable);  }  return{  publicMethod:function(){  privateMethod();  }  }  })();  myModule.publicMethod();
  由于是 IIFE 因此代码会被立即执行,并将返回对象赋值给了myModule变量。由于闭包,即使在 IIFE 完成后,返回的对象仍可以访问 IIFE 内部定义的函数和变量。
  因此,IIFE 内部定义的变量和函数对外部是看不见的,从而使其成为myModule模块的私有成员。
  执行代码后,myModule 变量看起来像下面所示:constmyModule={  publicMethod:function(){  privateMethod();  }};
  因此当我们调用publicMethod()时候,它将调用privateMethod()例如://Prints'HelloWorld'module.publicMethod();二、揭示模块模式
  揭示模块模式是 Christian Heilmann 对模块模式的略微改进。模块模式的问题在于,我们必须创建新的公共函数才能调用私有函数和变量。
  在这种模式下,我们将返回的对象的属性映射到要公开暴露的私有函数上。这就是为什么将其称为揭示模块模式。例如:constmyRevealingModule=(function(){  letprivateVar='Peter';  constpublicVar='HelloWorld';  functionprivateFunction(){  console.log('Name:'+privateVar);  }    functionpublicSetName(name){  privateVar=name;  }  functionpublicGetName(){  privateFunction();  }  /**revealmethodsandvariablesbyassigningthemtoobjectproperties*/return{  setName:publicSetName,  greeting:publicVar,  getName:publicGetName  };  })();  myRevealingModule.setName('Mark');//printsName:MarkmyRevealingModule.getName();
  这种模式让我们更容易知道哪些函数和变量是公共的,无形中提高了代码的可读性。执行代码后myRevealingModule看起来像下所示:constmyRevealingModule={  setName:publicSetName,  greeting:publicVar,  getName:publicGetName  };
  当我们调用myRevealingModule.setName('Mark')时,实际调用了内部的publicSetName。当调用myRevealingModule.getName()时,实际调用了内部的publicGetName例如:myRevealingModule.setName('Mark');//printsName:MarkmyRevealingModule.getName();
  与模块模式相比,揭示模块模式的优势有:
  通过修改 return 语句中的一行,我们可以将成员从公共变为为私人,反之亦然。
  返回的对象不包含任何函数定义,所有右侧表达式都在 IIFE 中定义,从而使代码清晰易读。三、ES6 模块
  在 ES6 之前,JavaScript 没有内置模块,因此开发人员必须依靠第三方库或模块模式来实现模块。但是自从 ES6,JavaScript 内置了模块。
  ES6 的模块是以文件形式存储的。每个文件只能有一个模块。默认情况下,模块内的所有内容都是私有的。通过使用export关键字来暴露函数、变量和类。模块内的代码始终在严格模式下运行。3.1 导出模块
  有两种方法可以导出函数和变量声明:
  在函数和变量声明的前面添加export关键字。例如://utils.jsexportconstgreeting='HelloWorld';exportfunctionsum(num1,num2){  console.log('Sum:',num1,num2);  returnnum1+num2;  }exportfunctionsubtract(num1,num2){  console.log('Subtract:',num1,num2);  returnnum1-num2;  }//ThisisaprivatefunctionfunctionprivateLog(){  console.log('PrivateFunction');  }
  在代码的最后添加export关键字来暴露函数和变量。例如://utils.jsfunctionmultiply(num1,num2){  console.log('Multiply:',num1,num2);  returnnum1*num2;  }functiondivide(num1,num2){  console.log('Divide:',num1,num2);  returnnum1/num2;  }//ThisisaprivatefunctionfunctionprivateLog(){  console.log('PrivateFunction');  }export{multiply,divide};3.2 导入模块
  与导出模块相似,有两种使用import关键字导入模块的方法。例如:
  一次导入多个项目//main.js//importingmultipleitemsimport{sum,multiply}from'./utils.js';console.log(sum(3,7));console.log(multiply(3,7));
  导入所有模块//main.js//importingallofmoduleimport*asutilsfrom'./utils.js';console.log(utils.sum(3,7));console.log(utils.multiply(3,7));3.3 导入导出中使用别名
  重命名导出//utils.jsfunctionsum(num1,num2){  console.log('Sum:',num1,num2);  returnnum1+num2;  }functionmultiply(num1,num2){  console.log('Multiply:',num1,num2);  returnnum1*num2;  }export{sumasadd,multiply};
  重命名导入//main.jsimport{add,multiplyasmult}from'./utils.js';console.log(add(3,7));console.log(mult(3,7));四、单例模式
  一个单例对象是只能实例化一次的对象。如果不存在,则单例模式将创建类的新实例。如果存在实例,则仅返回对该对象的引用。重复调用构造函数将始终获取同一对象。
  JavaScript 是一直内置单例的语言。我们只是不称它们为单例,我们称它们为对象字面量。例如:constuser={  name:'Peter',  age:25,  job:'Teacher',  greet:function(){  console.log('Hello!');  }  };
  因为 JavaScript 中的每个对象都占用一个唯一的内存位置,并且当我们调用该user对象时,实际上是在返回该对象的引用。
  如果我们尝试将user变量复制到另一个变量并修改该变量。例如:constuser1=user;  user1.name='Mark';
  我们将看到两个对象都被修改,因为 JavaScript 中的对象是通过引用而不是通过值传递的。因此,内存中只有一个对象。例如://prints'Mark'console.log(user.name);//prints'Mark'console.log(user1.name);//printstrueconsole.log(user===user1);
  可以使用构造函数来实现单例模式。例如:letinstance=null;functionUser(){  if(instance){  returninstance;  }  instance=this;  this.name='Peter';  this.age=25;    returninstance;  }constuser1=newUser();constuser2=newUser();//printstrueconsole.log(user1===user2);
  调用此构造函数时,它将检查instance对象是否存在。如果对象不存在,则将this变量分配给instance变量。如果该对象存在,则只返回该对象。
  单例也可以使用模块模式来实现。例如:constsingleton=(function(){  letinstance;    functioninit(){  return{  name:'Peter',  age:24,  };  }  return{  getInstance:function(){  if(!instance){  instance=init();  }    returninstance;  }  }  })();constinstanceA=singleton.getInstance();constinstanceB=singleton.getInstance();//printstrueconsole.log(instanceA===instanceB);
  在上面的代码中,我们通过调用singleton.getInstance方法来创建一个新实例。如果实例已经存在,则此方法仅返回该实例。如果该实例不存在,则通过调用该init()函数创建一个新实例。五、工厂模式
  工厂模式使用工厂方法创建对象而不需要指定具体的类或构造函数的模式。
  工厂模式用于创建对象而不需要暴露实例化的逻辑。当我们需要根据特定条件生成不同的对象时,可以使用此模式。例如:classCar{  constructor(options){  this.doors=options.doors||4;  this.state=options.state||'brandnew';  this.color=options.color||'white';  }  }classTruck{  constructor(options){  this.doors=options.doors||4;  this.state=options.state||'used';  this.color=options.color||'black';  }  }classVehicleFactory{  createVehicle(options){  if(options.vehicleType==='car'){  returnnewCar(options);  }elseif(options.vehicleType==='truck'){  returnnewTruck(options);  }  }  }
  这里,创建了一个Car和一个Truck类(具有一些默认值),该类用于创建新的car和truck对象。而且定义了一个VehicleFactory类,用来根据options对象中的vehicleType属性来创建和返回新的对象。constfactory=newVehicleFactory();constcar=factory.createVehicle({  vehicleType:'car',  doors:4,  color:'silver',  state:'BrandNew'});consttruck=factory.createVehicle({  vehicleType:'truck',  doors:2,  color:'white',  state:'used'});//PrintsCar{doors:4,state:"BrandNew",color:"silver"}console.log(car);//PrintsTruck{doors:2,state:"used",color:"white"}console.log(truck);
  我为类VehicleFactory创建了一个新的factory对象。然后,我们通过调用factory.createVehicle方法并且传递options对象,其vehicleType属性可能为car或者truck来创建新Car或Truck对象。六、装饰器模式
  装饰器模式用于扩展对象的功能,而无需修改现有的类或构造函数。此模式可用于将特征添加到对象中,而无需修改底层的代码。
  此模式的一个简单示例为:functionCar(name){  this.name=name;  //Defaultvaluesthis.color='White';  }//CreatinganewObjecttodecorateconsttesla=newCar('TeslaModel3');//Decoratingtheobjectwithnewfunctionalitytesla.setColor=function(color){  this.color=color;  }  tesla.setPrice=function(price){  this.price=price;  }  tesla.setColor('black');  tesla.setPrice(49000);//printsblackconsole.log(tesla.color);
  这种模式的一个更实际的例子是:
  假设汽车的成本取决于其功能的数量。如果没有装饰器模式,我们将不得不为不同的功能组合创建不同的类,每个类都有一个cost方法来计算成本。例如:classCar(){}classCarWithAC(){}classCarWithAutoTransmission{}classCarWithPowerLocks{}classCarWithACandPowerLocks{}
  但是,通过装饰器模式,我们可以创建一个基类car并且通过装饰器函数给不同的对象添加对应的成本逻辑。classCar{  constructor(){  //DefaultCostthis.cost=function(){  return20000;  }  }  }//DecoratorfunctionfunctioncarWithAC(car){  car.hasAC=true;  constprevCost=car.cost();  car.cost=function(){  returnprevCost+500;  }  }//DecoratorfunctionfunctioncarWithAutoTransmission(car){  car.hasAutoTransmission=true;  constprevCost=car.cost();  car.cost=function(){  returnprevCost+2000;  }  }//DecoratorfunctionfunctioncarWithPowerLocks(car){  car.hasPowerLocks=true;  constprevCost=car.cost();  car.cost=function(){  returnprevCost+500;  }  }
  首先,我们创建了小轿车的基类Car。然后针对要添加的特性创建了装饰器并且此装饰器以Car对象为参数。然后通过返回更新后的小汽车成本来覆盖对象的成本函数,且添加了一个用来标识某个特性是否已经被添加的属性。
  要添加新的功能,我们只需要像下面一样就可以:constcar=newCar();  console.log(car.cost());  carWithAC(car);  carWithAutoTransmission(car);  carWithPowerLocks(car);
  最后,我们可以像这样计算汽车的成本://Calculatingtotalcostofthecarconsole.log(car.cost());结论
  我们已经了解了 JavaScript 中使用的各种设计模式,但是这里没有涉及到可以用 JavaScript 实现的设计模式。
  尽管了解各种设计模式很重要,但不要过度使用它们也同样重要。在使用设计模式之前,你应该仔细考虑你的问题是否适合该设计模式。要知道某个模式是否适合你的问题,应该好好研究该设计模式以及它的应用。

糖尿病伤口(糖尿病伤口久久不愈合?)糖尿病伤口(糖尿病伤口久久不愈合?)糖尿病属于内分泌性的疾病,一般发生在老年人以及孕妇身上。当病情发展到一定程度时会引起周围神经病变,当身体上出现伤口时会一直不愈合或者愈合速度慢,缝针多久能拆线(缝线多长时间可以拆线)经历了术前检查,等待入院,术前沟通,终于完成了手术,顺利出院,门诊换了几次药,接下来最关心的就是拆线的问题。可以拆线了吗?拆线时会疼吗?拆线时会出血吗?拆完线后是不是就没事了?真相独立显卡有什么用(独立显卡和集成显卡哪个好)对于独立显卡和集成显卡,我们从名字就能够看出二者的区别,顾名思义,独立出来的显卡就叫独立显卡,而集成在主板的显卡就是集成显卡。这两种显卡存在什么样的优劣势呢?独立显卡和集成显卡是否集成显卡和独立显卡哪个好(集成显卡和2g独立显卡哪个好)目前独立显卡早已有多种了,例如独立显卡集成显卡及其集成显卡等,不一样独立显卡的精准定位不一样。现在来说说集成显卡主板集成显卡和独立显卡的区别。独立显卡说白了便是单独出去的独立显卡的什么油烟机好(最便宜油烟机价格)十大油烟机品牌优缺点盘点,详细选购指南,看看哪个品牌性价比更高!方太创立于1996年,国内头部厨电品牌,在高端市场的占有率达到30以上,也是烟机行业的佼佼者。方太吸油烟机吸力足的同怎么清洗抽油烟机(顶吸抽油烟机拆卸清洗图解)前两天收到公司饭堂倒闭的消息结束带饭的日子遥遥无期我想得赶紧清洁油烟机Skr复工后每天都带饭上班的你,有注意到家里的油烟机已经非!常!脏!了吗?PC酱依靠祖传的网上冲浪技巧,并结合核显是什么(笔记本买独显好还是集显好)目前独立显卡早已有多种了,例如独立显卡集成显卡及其集成显卡等,不一样独立显卡的精准定位不一样。现在来说说集成显卡主板集成显卡和独立显卡的区别。独立显卡说白了便是单独出去的独立显卡的海尔抽油烟机怎么样(海尔抽油烟机290v价格)现在的家庭,基本每家每户都有抽油烟机,在厨房中,抽油烟机扮演着非常重要的角色。当抽油烟机使用了一段时间之后,我们就会发现抽油烟机出现众多油烟,那么这个时候,大家就可以对抽油烟机进行天然气灶哪个牌子好(老板哪款油烟机好)如今大家选择厨房电器时的要求也比较多了,但仍然会被一些燃气灶的虚假宣传所欺骗,不仅花了冤枉钱做不出好吃的饭菜,更严重的是还会有安全隐患。燃气灶哪个好?一直让喜欢烹饪的小伙伴们十分困华帝燃气灶怎么样(华帝油烟机煤气灶怎么样)前言趴趴家之前烟机炉灶是京东上买的樱花的一套,开心爷爷炒菜多油多盐使用了一年多的时间明显感觉到虽然理论吸力不小,但是实际对于油烟的控制效果不佳,家中烟机灶具周围靠近烟机的墙壁油渍非华帝和老板哪个好(华帝和帅康油烟机哪个质量好)网上吸油烟机推荐吸油烟机购物指南和选购攻略满天飞,靠谱的却寥寥无几!你是否依然困惑吸油烟机怎么选?吸油烟机哪个牌子好?哪款产品值得入手?干货来了,5大电商平台,2021年19月吸油
察言观色的意思(如何学会察言观色)察言观色的意思(如何学会察言观色)小张在大学里是学电气自动化专业的,毕业后分配到一家国营企业的仪器设备管理处,负责全厂仪器设备的维护保养和维修工作,这年和小张一起分配到仪器设备管理文案是做什么的(文案主要是干什么工作)编辑导语随着互联网信息的更新迭代,常用的文案套路已经不管用了,文案也需要输出创意。同时,文案在具备文字撰写和创意能力之外,也要具备策略思考能力,这样有助于明白用户诉求,写出真正能够中国有哪些旅游胜地(中国什么地方旅游最好)中国有哪些旅游胜地(中国什么地方旅游最好)虽然古时候中国历经很多次朝代更迭,但即便是位于不同的时期,不同的政权,当时的统治者也都意识到了捍卫领土的重要性。长城便是经由不同时期,不同钱来也贷款怎么样(小额贷款公司)P2P网络理财平台在国内的发展非常火爆,大多数的网站都为普通老百姓提供理财与贷款各项业务,对于投资理财的投资者来说,利用出借人的身份能够达到资产的收益增值,同时借款方能够获得足够的信贷怎么样(邀约客户贷款工作怎么样)您好,我是银行的,由于您信用良好,可以贷款最高元,只需要您带上身份证过来就可以了。大家有没有接到过类似的推销电话或者短信?如果你之前有在某个银行或者某个贷款机构做过贷款的,或者在某乾隆在位多少年(乾隆故意弄痛如懿给凌云彻听)爱情会冷,婚姻会旧,人会走!以前读这句话只觉得伤感,如今看来,却是真正的诛心之语,重读如懿传我们感到好奇,乾隆最初深爱着如懿,为了她敢忤逆父皇的旨意,执意纳她为侧福晋,多年来,苦心今日建国钞价格查询(建国50周年纪念钞价格)建国50周年纪念钞三个尾号一样的,仅供参考由于发行量原因,首页财经证券理财投资行情中心专题1深圳四十周年是几月几号建国成立50周年纪念币万枚20元枚盒35澳门特别行政区成立纪念币万怎样可以查一个人在哪些酒店住过(一般人能查到宾馆记录吗)怎样可以查一个人在哪些酒店住过(一般人能查到宾馆记录吗)1身份证已连接。如果你知道这个人的身份证号码,你可以直接到公安局去查看开门记录,包括开门的时间日期和住几天。是否退房被记录下欧品怎么样(相约欧品)9月19日下午,2019年第二届浙江(温州)进口消费品博览会新闻发布会在温州召开。永不落幕的进口平台去年10月底举办的首届温州进口展,有效承接了中国国际进口博览会的集聚效应和溢出效叶诗文为什么变差了(叶诗文第四)近日,中国游泳争霸赛落幕,在本次比赛中,不少国家队选手发挥出色,更是涌现了不少未来之星,但是奥运冠军叶诗文的表现却是比较糟糕!叶诗文虽然还未满25岁,但已是奥运会,世锦赛冠军,成为阿娘黄鱼面(阿娘黄鱼面思南路)阿娘黄鱼面(阿娘黄鱼面思南路)位于上海思南路上的这家面馆,可谓是大名鼎鼎了,几乎每一个老上海人都知道。其前身是成立于上个世纪九十年代的泰和饮食店,店主是个宁波老婆婆,因宁波话中婆婆