幼儿饰品瑜伽美体用品微软
投稿投诉
微软创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品

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

  javascript设计模式(JavaScript的7种设计模式)
  当启动一个新的项目时候,我们不应该马上开始编程。而是首先应该定义项目的目的和范围,然后列出其功能或规格。如果你已经开始编程或者正在从事一个复杂的项目,则应该选择一个最适合你项目的设计模式。什么是设计模式?
  在软件工程中,设计模式是针对软件设计中常见问题的可重用解决方案。设计模式也是经验丰富的开发人员针对特定问题的最佳实践。它可以被当作编程的模板。为什么要使用设计模式?
  许多工程师要么认为设计模式浪费时间,要么不知道如何恰当的使用设计模式。但如果能正确使用设计模式,则可以帮助你写出更好的可读性更高的代码,并且代码更容易被维护和理解。
  最重要的是,设计模式为软件开发人员提供了通用的词汇表。它们能让学习你代码的人很快了解代码的意图。例如,如果你的项目中使用了装饰器模式,那么新的开发可以很快就知道这段代码的作用,从而他们可以将更多精力放在解决业务问题上,而不是试图理解代码在做什么。
  我们已经知道了什么是设计模式和它的重要性,下面我们深入研究一下JavaScript中的7种设计模式。一、模块模式
  模块是一段独立的代码,因此我们可以更新模块而不会影响代码的其它部分。模块还允许我们通过为变量创建单独的作用域来避免命名空间污染。当它们与其它代码解耦时,我们还可以在其它项目中重用模块。
  模块是任何现代JavaScript应用程序不可或缺的一部分,有助于保持代码干净,独立和有条理。在JavaScript中有许多方法可以创建模块,其中一种是模块模式。
  与其它编程语言不同,JavaScript没有访问修饰符,也就是说,你不能将变量声明为私有的或公共的。因此,模块模式也可用来模拟封装的概念。
  模块模式使用IIFE(立即调用的函数表达式),闭包和函数作用域来模拟封装的概念。例如:constmyModule(function(){constprivateVariable39;HelloWorld39;;functionprivateMethod(){console。log(privateVariable);}return{publicMethod:function(){privateMethod();}}})();myModule。publicMethod();
  由于是IIFE因此代码会被立即执行,并将返回对象赋值给了myModule变量。由于闭包,即使在IIFE完成后,返回的对象仍可以访问IIFE内部定义的函数和变量。
  因此,IIFE内部定义的变量和函数对外部是看不见的,从而使其成为myModule模块的私有成员。
  执行代码后,myModule变量看起来像下面所示:constmyModule{publicMethod:function(){privateMethod();}};
  因此当我们调用publicMethod()时候,它将调用privateMethod()例如:Prints39;HelloWorld39;module。publicMethod();二、揭示模块模式
  揭示模块模式是ChristianHeilmann对模块模式的略微改进。模块模式的问题在于,我们必须创建新的公共函数才能调用私有函数和变量。
  在这种模式下,我们将返回的对象的属性映射到要公开暴露的私有函数上。这就是为什么将其称为揭示模块模式。例如:constmyRevealingModule(function(){letprivateVar39;Peter39;;constpublicVar39;HelloWorld39;;functionprivateFunction(){console。log(39;Name:39;privateVar);}functionpublicSetName(name){privateVarname;}functionpublicGetName(){privateFunction();}revealmethodsandvariablesbyassigningthemtoobjectpropertiesreturn{setName:publicSetName,greeting:publicVar,getName:publicGetName};})();myRevealingModule。setName(39;Mark39;);printsName:MarkmyRevealingModule。getName();
  这种模式让我们更容易知道哪些函数和变量是公共的,无形中提高了代码的可读性。执行代码后myRevealingModule看起来像下所示:constmyRevealingModule{setName:publicSetName,greeting:publicVar,getName:publicGetName};
  当我们调用myRevealingModule。setName(39;Mark39;)时,实际调用了内部的publicSetName。当调用myRevealingModule。getName()时,实际调用了内部的publicGetName例如:myRevealingModule。setName(39;Mark39;);printsName:MarkmyRevealingModule。getName();
  与模块模式相比,揭示模块模式的优势有:
  通过修改return语句中的一行,我们可以将成员从公共变为为私人,反之亦然。
  返回的对象不包含任何函数定义,所有右侧表达式都在IIFE中定义,从而使代码清晰易读。三、ES6模块
  在ES6之前,JavaScript没有内置模块,因此开发人员必须依靠第三方库或模块模式来实现模块。但是自从ES6,JavaScript内置了模块。
  ES6的模块是以文件形式存储的。每个文件只能有一个模块。默认情况下,模块内的所有内容都是私有的。通过使用export关键字来暴露函数、变量和类。模块内的代码始终在严格模式下运行。3。1导出模块
  有两种方法可以导出函数和变量声明:
  在函数和变量声明的前面添加export关键字。例如:utils。jsexportconstgreeting39;HelloWorld39;;exportfunctionsum(num1,num2){console。log(39;Sum:39;,num1,num2);returnnum1num2;}exportfunctionsubtract(num1,num2){console。log(39;Subtract:39;,num1,num2);returnnum1num2;}ThisisaprivatefunctionfunctionprivateLog(){console。log(39;PrivateFunction39;);}
  在代码的最后添加export关键字来暴露函数和变量。例如:utils。jsfunctionmultiply(num1,num2){console。log(39;Multiply:39;,num1,num2);returnnum1num2;}functiondivide(num1,num2){console。log(39;Divide:39;,num1,num2);returnnum1num2;}ThisisaprivatefunctionfunctionprivateLog(){console。log(39;PrivateFunction39;);}export{multiply,divide};3。2导入模块
  与导出模块相似,有两种使用import关键字导入模块的方法。例如:
  一次导入多个项目main。jsimportingmultipleitemsimport{sum,multiply}from39;。utils。js39;;console。log(sum(3,7));console。log(multiply(3,7));
  导入所有模块main。jsimportingallofmoduleimportasutilsfrom39;。utils。js39;;console。log(utils。sum(3,7));console。log(utils。multiply(3,7));3。3导入导出中使用别名
  重命名导出utils。jsfunctionsum(num1,num2){console。log(39;Sum:39;,num1,num2);returnnum1num2;}functionmultiply(num1,num2){console。log(39;Multiply:39;,num1,num2);returnnum1num2;}export{sumasadd,multiply};
  重命名导入main。jsimport{add,multiplyasmult}from39;。utils。js39;;console。log(add(3,7));console。log(mult(3,7));四、单例模式
  一个单例对象是只能实例化一次的对象。如果不存在,则单例模式将创建类的新实例。如果存在实例,则仅返回对该对象的引用。重复调用构造函数将始终获取同一对象。
  JavaScript是一直内置单例的语言。我们只是不称它们为单例,我们称它们为对象字面量。例如:constuser{name:39;Peter39;,age:25,job:39;Teacher39;,greet:function(){console。log(39;Hello!39;);}};
  因为JavaScript中的每个对象都占用一个唯一的内存位置,并且当我们调用该user对象时,实际上是在返回该对象的引用。
  如果我们尝试将user变量复制到另一个变量并修改该变量。例如:constuser1user;user1。name39;Mark39;;
  我们将看到两个对象都被修改,因为JavaScript中的对象是通过引用而不是通过值传递的。因此,内存中只有一个对象。例如:prints39;Mark39;console。log(user。name);prints39;Mark39;console。log(user1。name);printstrueconsole。log(useruser1);
  可以使用构造函数来实现单例模式。例如:letinstancenull;functionUser(){if(instance){returninstance;}instancethis;this。name39;Peter39;;this。age25;returninstance;}constuser1newUser();constuser2newUser();printstrueconsole。log(user1user2);
  调用此构造函数时,它将检查instance对象是否存在。如果对象不存在,则将this变量分配给instance变量。如果该对象存在,则只返回该对象。
  单例也可以使用模块模式来实现。例如:constsingleton(function(){letinstance;functioninit(){return{name:39;Peter39;,age:24,};}return{getInstance:function(){if(!instance){instanceinit();}returninstance;}}})();constinstanceAsingleton。getInstance();constinstanceBsingleton。getInstance();printstrueconsole。log(instanceAinstanceB);
  在上面的代码中,我们通过调用singleton。getInstance方法来创建一个新实例。如果实例已经存在,则此方法仅返回该实例。如果该实例不存在,则通过调用该init()函数创建一个新实例。五、工厂模式
  工厂模式使用工厂方法创建对象而不需要指定具体的类或构造函数的模式。
  工厂模式用于创建对象而不需要暴露实例化的逻辑。当我们需要根据特定条件生成不同的对象时,可以使用此模式。例如:classCar{constructor(options){this。doorsoptions。doors4;this。stateoptions。state39;brandnew39;;this。coloroptions。color39;white39;;}}classTruck{constructor(options){this。doorsoptions。doors4;this。stateoptions。state39;used39;;this。coloroptions。color39;black39;;}}classVehicleFactory{createVehicle(options){if(options。vehicleType39;car39;){returnnewCar(options);}elseif(options。vehicleType39;truck39;){returnnewTruck(options);}}}
  这里,创建了一个Car和一个Truck类(具有一些默认值),该类用于创建新的car和truck对象。而且定义了一个VehicleFactory类,用来根据options对象中的vehicleType属性来创建和返回新的对象。constfactorynewVehicleFactory();constcarfactory。createVehicle({vehicleType:39;car39;,doors:4,color:39;silver39;,state:39;BrandNew39;});consttruckfactory。createVehicle({vehicleType:39;truck39;,doors:2,color:39;white39;,state:39;used39;});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。namename;Defaultvaluesthis。color39;White39;;}CreatinganewObjecttodecorateconstteslanewCar(39;TeslaModel339;);Decoratingtheobjectwithnewfunctionalitytesla。setColorfunction(color){this。colorcolor;}tesla。setPricefunction(price){this。priceprice;}tesla。setColor(39;black39;);tesla。setPrice(49000);printsblackconsole。log(tesla。color);
  这种模式的一个更实际的例子是:
  假设汽车的成本取决于其功能的数量。如果没有装饰器模式,我们将不得不为不同的功能组合创建不同的类,每个类都有一个cost方法来计算成本。例如:classCar(){}classCarWithAC(){}classCarWithAutoTransmission{}classCarWithPowerLocks{}classCarWithACandPowerLocks{}
  但是,通过装饰器模式,我们可以创建一个基类car并且通过装饰器函数给不同的对象添加对应的成本逻辑。classCar{constructor(){DefaultCostthis。costfunction(){return20000;}}}DecoratorfunctionfunctioncarWithAC(car){car。hasACtrue;constprevCostcar。cost();car。costfunction(){returnprevCost500;}}DecoratorfunctionfunctioncarWithAutoTransmission(car){car。hasAutoTransmissiontrue;constprevCostcar。cost();car。costfunction(){returnprevCost2000;}}DecoratorfunctionfunctioncarWithPowerLocks(car){car。hasPowerLockstrue;constprevCostcar。cost();car。costfunction(){returnprevCost500;}}
  首先,我们创建了小轿车的基类Car。然后针对要添加的特性创建了装饰器并且此装饰器以Car对象为参数。然后通过返回更新后的小汽车成本来覆盖对象的成本函数,且添加了一个用来标识某个特性是否已经被添加的属性。
  要添加新的功能,我们只需要像下面一样就可以:constcarnewCar();console。log(car。cost());carWithAC(car);carWithAutoTransmission(car);carWithPowerLocks(car);
  最后,我们可以像这样计算汽车的成本:Calculatingtotalcostofthecarconsole。log(car。cost());结论
  我们已经了解了JavaScript中使用的各种设计模式,但是这里没有涉及到可以用JavaScript实现的设计模式。
  尽管了解各种设计模式很重要,但不要过度使用它们也同样重要。在使用设计模式之前,你应该仔细考虑你的问题是否适合该设计模式。要知道某个模式是否适合你的问题,应该好好研究该设计模式以及它的应用。

中秋节小故事(中秋节的小故事简短)中秋节小故事(中秋节的小故事简短)异地恋军恋。他是海军,大部分时间都在海上,听声音都费劲,更别说见面了。上学时室友们煲电话粥,可我只要收到他一条信息,就快乐得飞起。大三那……什么是失眠(为什么你会失眠?)什么是失眠(为什么你会失眠?)什么是失眠?失眠是指没有办法睡着或没有办法保持睡眠状态,导致睡眠不足。这样子会给患者带来极大的痛苦和心理负担,并且对工作和日常生活会产生一定……说说雪花秀宫中蜜皂怎么样近日有关于雪花秀宫中蜜皂怎么样的问题受到了很多网友们的关注,大多数网友都想要知道网友们需要雪花秀宫中蜜皂怎么样问题的具体情况,那么关于到网友们需要雪花秀宫中蜜皂怎么样问题的相关……什么是我们党的生命线和根本工作路线(两个维护的内容)作者:广言在主题教育工作会议上的重要讲话中,习近平总书记站在党和国家事业发展全局的战略高度,用四个迫切需要深刻阐述了开展主题教育活动的重大意义,为我们开展主题教育活动指明……抑郁有哪些表现(抑郁测试)看过《脱口秀大会》的朋友们,应该都知道北大学霸李雪琴,这个看起来乐观爱笑的女孩,曾经也是一名抑郁症患者。单亲家庭长大的她,一直是妈妈的精神支柱,为了让妈妈开心,她努力学习……罗伯特德尼罗(罗伯特德尼罗作品全集)罗伯特德尼罗(罗伯特德尼罗作品全集)丨本文首发于皮皮电影皮皮电影每天一部精彩电影推荐好莱坞影坛传奇罗伯特德尼罗虽已经77岁高龄,却仍然老当益壮,在去年主演20……詹天佑教学设计(人教版六年级下册语文电子课本)詹天佑教学设计(人教版六年级下册语文电子课本)教材继续按专题组织单元,共八组,依次是:感受自然,祖国在我心中,心灵之歌,珍爱我们的家园,初识鲁迅,轻叩诗歌的大门,人与动物……电脑开机声音大怎么回事(电脑开机主机声音很大是什么情况)电脑开机声音大怎么回事(电脑开机主机声音很大是什么情况)电脑使用1段时间后常常发生开机后会出现声音过大像发动机一样的叫,我把原因归结为2类,1种是风扇声音过大,1种是其他……福特一月底前购车11年式新车不涨价现在购车享0利率优惠再加送MIO行车记录器福特六和宣布自2月1日起调涨旗下11年式车款售价1。54热销车款Focus全车系调涨1万6千元Escape2。34WD调涨2万元……一天用多少电(电表一天多少电正常)(1)日用电量的计算一、是未装带有电流互感器的电度表,电度表在24小时内的累积数就是日用电量,即:本日正24时电度表的读数减去上一日24点的电度表读数等于日用电量。……10号台风路径最新消息截止到目前,2020年已经有8个台风登陆,很多地方都受到了台风的影响和破坏,这也引起了大家对台风的重视,接下来2020年9号台风、10号台风都将陆续生成登陆,大家都想了解10号……石龙是哪里的(东莞石龙镇怎么样)中国共产党东莞市石龙镇第十六次代表大会8月26日举行,全镇160名党员代表参加会议,通过选举产生石龙镇第十六届镇委领导班子、镇纪委领导班子成员,讨论通过关于第十五届镇委工作报告……
全新第六代MASERATIQuattroporteGTS荣耀MASERATI台北旗舰展示中心隆重开幕顶级豪华车惊人成长驱动下,加速MASERATI积极布局全球市场,蒙地拿斥资打造MASERATI台北旗舰展示中心,于今(426)隆重……租房哪个网站靠谱(房东直接租房的平台)随着酷暑来临,又一届毕业生走出了校园,即将迈向工作岗位,开始自己人生的下一段旅程。据统计,2021年高校毕业生总规模预计为909万人,同比去年增加35万人,再创新高。毕业季,不……仙人掌怎么养(仙人掌种植方法)仙人掌怎么养(仙人掌种植方法)仙人掌是一种耐旱植物,种植方法操作简单,种植后精心养护可以健康生长。一、仙人掌的种植方法1。土壤仙人掌种植使用排水性和透气性好的……唐人街探案3怎么参与投资呢?最低投资多少呢?成本多少呢?资深影视分析,如果你对目前了解的电影项目有任何疑问,可以咨询我,为你提供专业的指导性意见,寻找正规的投资渠道成为真正的电影联合出品人咨询热线13051062518【微信同……携号转网怎么操作(携号转网入移动有什么套餐)携号转网步骤:(全程网上操作,无需跑营业厅)以联通转移动为例:第一步:发送短信:CXXZ自己的姓名自己的证件号码到10010查询有无影响的相关业务,有的话10……毛晓彤新恋情是真的吗近日有关于毛晓彤新恋情是真的吗的问题受到了很多网友们的关注,大多数网友都想要知道毛晓彤新恋情是真的吗的具体情况,那么关于到毛晓彤新恋情是真的吗的相关信息,小编也是在网上进行了一……宁波哪些镇(宁波有哪些城镇)摘要:宁波地名用字独具特色,这些特殊的地名用字以专用的字形、特定的含义,成为语言、地理、历史等多侧面的综合体,承载着地域文化,凝聚着乡土情感。本文选取了堠嘾隤这三个具有代表性的……什么是微信客户端(微信和微信客户端是一回事吗)即便做不到无需手机扫描二维码登录,我们对这样一款国民级应用的桌面客户端需求依然是尽可能地让我们放下手机换句话说,坐在电脑前工作时,大部分需要拿起手机在中处理的事情都能通过桌面客……孙家栋坐轮椅见证北斗三号开通91岁首任总设计师!今天,91岁高龄的首任北斗卫星导航系统总设计师孙家栋,坐着轮椅到现场见证仪式!致敬!孙家栋坐轮椅见证北斗三号开通孙家栋,男,汉族,中共党员,1929年4月8日出生,……哪个奥特曼最好看(史上收视率最高的十大奥特曼)各位光之继承人大家好,给你讲述不一样的奥特故事。相信很多小伙伴第一个看得都是昭和时期的奥特曼吧,小时候经常租光碟录像带背着家长偷偷看,昭和时期的奥特曼没有现在新生代这么花……word如何画图(怎样在文档里面制图)对于大多数人来说,一般只是用Word来处理文字,但其实Word也可以用来绘图,操作很简单,一起学起来吧!一、绘制流程图1。构造基本结构步骤:插入形状在流程图选项中选……淡水鱼生鱼片(哪些鱼适合做生鱼片)淡水鱼生鱼片(哪些鱼适合做生鱼片)很多人应该都知道三文鱼常常用来做生鱼片,味道非常鲜美。那么除了三文鱼,还有哪些鱼适合做生鱼片?赶紧和小编一起来看看这篇文章吧。哪些……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网