js是什么意思?(前端开发需要知道7种常用的JavaScript设计模式)
如果有更好的建议或者想看更多关于综合百科技术大全及相关资讯,可以多多关注茶馆百科网。

作者|Deven
译者|王强
策划|肖志
正向链接:https://mp.weixin.qq.com/s/Lw4D7bfUSw_kPoJMD6W8gg
前言
JavaScript中的设计模式参考了一些可复用的解决方案,适用于编写JavaScriptWeb应用时的一些常见问题。本文原载于codesource.io网站,经原作者授权,由InfoQ中文网翻译分享。
开发人员使用JavaScript设计模式作为解决问题的模板是合适的,但并不意味着这些模式可以取代开发人员的工作。
通过设计模式,我们可以结合很多开发者的经验,以优化的方式构造代码,从而解决我们面临的问题。设计模式还提供了描述问题解决方案的通用词汇,而不是枯燥地描述代码的语法和语义。
JavaScript设计模式可以帮助开发人员编写组织良好、美观且结构良好的代码。尽管设计模式易于重用,但它们并不打算取代开发人员的工作;他们是开发者的支持和协助,提供与具体应用无关的通用解决方案,尽量避免可能导致Web应用开发出现重大问题的小漏洞。
与临时解决方案相比,它们消除了不必要的重复,从而减少了代码库的整体大小,并使我们的代码更加健壮。
在本文中,我将讨论7中最优秀和最流行的JavaScript设计模式,主要分为以下三类:创意设计模式、结构设计模式和行为设计模式。
1、构造函数设计模式
这是在分配内存后初始化新创建的对象的特殊方法。因为JavaScript通常是面向对象的,所以它处理对象最多。所以我打算深入研究对象构造函数。在JavaScript中创建新对象有三种方法。创建构造函数设计模式的一种方法如下。
//创建新的空对象varnew object={ };//新建一个空对象var new object=object . Create(object . prototype);varnew object=new object();要访问函数的属性,需要初始化对象。
const object=newConstructorObject();上面的new关键字告诉JavaScript,constructorObject应该充当构造函数。此设计模式不支持继承。更多详情请点击此处:
https://addyosmani.com/resources/essentialjsdesignpatterns/book/# constructorpattern Java script
2、原型模式
原型模式基于原型继承。在这种模式下,创建的对象充当其他对象的原型。事实上,原型是创建的每个对象构造器的蓝图。例子
varmyCar={name:'FordEscort 'brake : function(){ console . log(' Stop!iamapplyingbrakes’);} panic : function(){ console . log(' wait . howdoyoustopthuithing?')} }//使用objectcreate实例化一个新的carvaryourcar=object . create(mycar);//现在是另一个console.log(yourCar.name)的原型;]
3、模块设计模式
模块设计模式对原型模式做了一些改进。模块模式有不同类型的修饰符(私有的和公共的)。您可以创建相似的函数或属性,而不会产生冲突。我们还可以灵活地公开重命名函数。这种设计模式的一个缺点是它不能覆盖在外部环境中创建的功能。例子
functionAnimalContainter(){ const container=[];functionaddAnimal(name){ container . push(name);} functiongetAllAnimals(){ return container;} functionremoveAnimal(name){ constindex=container . index of(name);if(index 1){ thrownewError(' animalnotfoudincontainer ');}container.splice(index,1)}return{add:addAnimal,get:getAllAnimals,remove : remove animal } } const container=animalcontainer();container . add(' Hen ');container.add('山羊');集装箱。
add('Sheep');console.log(container.get())//Array(3)["Hen","Goat","Sheep"]container.remove('Sheep')console.log(container.get());//Array(2)["Hen","Goat"]4、单例模式
在仅需要创建一个实例的情况下(例如一个数据库连接),这个模式是必需的。在这个模式中,只能在关闭连接时创建一个实例,或者在打开新实例之前必须关闭已有的实例。此模式也称为严格模式,它的一个缺点是测试时的体验很差,因为它隐藏的依赖项对象很难挑出来进行测试。
示例
functionDatabaseConnection(){letdatabaseInstance=null;//追踪特定时间创建实例的数量letcount=0;functioninit(){console.log(`Openingdatabase#${count+1}`);//现在执行操作}functioncreateIntance(){if(databaseInstance==null){databaseInstance=init();}returndatabaseInstance;}functioncloseIntance(){console.log('closingdatabase');databaseInstance=null;}return{open:createIntance,close:closeIntance}}constdatabase=DatabseConnection();database.open();//Opendatabase#1database.open();//Opendatabase#1database.open();//Opendatabase#1database.close();//closedatabase5、工厂模式
这个模式的创新之处在于,它不需要构造函数就能创建对象。它提供了用于创建对象的通用接口,我们可以在其中指定要创建的工厂(factory)对象的类型。这样一来,我们只需指定对象,然后工厂会实例化并返回这个对象供我们使用。当对象组件设置起来很复杂,并且我们希望根据所处的环境轻松地创建不同的对象实例时,使用工厂模式就是很明智的选择。在处理许多共享相同属性的小型对象,以及创建一些需要解耦的对象时也可以使用工厂模式。
示例
//DealerADealerA={};DealerA.title=functiontitle(){return"DealerA";};DealerA.pay=functionpay(amount){console.log(`setupconfigurationusingusername:${this.username}andpassword:${this.password}`);return`Paymentforservice${amount}issuccessfulusing${this.title()}`;};//DealerBDealerB={};DealerB.title=functiontitle(){return"DealerB";};DealerB.pay=functionpay(amount){console.log(`setupconfigurationusingusername:${this.username}andpassword:${this.password}`);return`Paymentforservice${amount}issuccessfulusing${this.title()}`;};//@param{*}DealerOption//@param{*}configfunctionDealerFactory(DealerOption,config={}){constdealer=Object.create(dealerOption);Object.assign(dealer,config);returndealer;}constdealerFactory=DealerFactory(DealerA,{username:"user",password:"pass"});console.log(dealerFactory.title());console.log(dealerFactory.pay(12));constdealerFactory2=DealerFactory(DealerB,{username:"user2",password:"pass2"});console.log(dealerFactory2.title());console.log(dealerFactory2.pay(50));6、观察者模式
观察者(observer)设计模式在许多对象同时与其他对象集通信的场景中用起来很方便。在观察者模式中不会在状态之间发生不必要的事件push和pull;相比之下,所涉及的模块仅会修改数据的当前状态。
示例
functionObserver(){this.observerContainer=[];}Observer.prototype.subscribe=function(element){this.observerContainer.push(element);}//下面是从container中移除一个元素Observer.prototype.unsubscribe=function(element){constelementIndex=this.observerContainer.indexOf(element);if(elementIndex>-1){this.observerContainer.splice(elementIndex,1);}}/***wenotifyelementsaddedtothecontainerbycalling*eachsubscribedcomponentsaddedtoourcontainer*/Observer.prototype.notifyAll=function(element){this.observerContainer.forEach(function(observerElement){observerElement(element);});}7、命令模式
最后介绍的是命令(command)模式。命令设计模式将方法调用、操作或请求封装到单个对象中,以便我们可以自行传递方法调用。命令设计模式让我们可以从任何正在执行的命令中发出命令,并将责任委托给与之前不同的对象。这些命令以run()和execute()格式显示。
(function(){varcarManager={//请求的信息requestInfo:function(model,id){return"Theinformationfor"+model+"withID"+id+"isfoobar";},//现在购买这个carbuyVehicle:function(model,id){return"YouhavesuccessfullypurchasedItem"+id+",a"+model;},//现在arrangeviewingarrangeViewing:function(model,id){return"Youhavesuccessfullybookedaviewingof"+model+"("+id+")";}};})();小结
对于JavaScript开发人员来说,使用设计模式的好处很多。设计模式的一些主要优点包括提升项目的可维护性,还能减少开发周期中不必要的工作。JavaScript设计模式可以为复杂的问题提供解决方案,提升开发速度并提高生产率。但并不能说这些设计模式就可以让开发人员偷懒了。
推荐JavaScript经典实例学习资料文章
《浅谈浏览器架构、单线程js、事件循环、消息队列、宏任务和微任务》
《了不起的WebpackHMR学习指南(上)「含源码讲解」》
《了不起的WebpackHMR学习指南(下)「含源码讲解」》
《10个打开了我新世界大门的WebAPI(上)「实践」》
《10个打开了我新世界大门的WebAPI(中)「实践」》
《10个打开了我新世界大门的WebAPI(下)「实践」》
《「图文」ESLint在中大型团队的应用实践》
《Deno是代码的浏览器,你认同吗?》
《前端存储除了localStorage还有啥?》
《Javascript多线程编程的前世今生》
《微前端方案qiankun(实践及总结)》
《「图文」V8垃圾回收原来这么简单?》
《Webpack5模块联邦引发微前端的革命?》
《基于Web端的人脸识别身份验证「实践」》
《「前端进阶」高性能渲染十万条数据(时间分片)》
《「前端进阶」高性能渲染十万条数据(虚拟列表)》
《图解Promise实现原理(一):基础实现》
《图解Promise实现原理(二):Promise链式调用》
《图解Promise实现原理(三):Promise原型方法实现》
《图解Promise实现原理(四):Promise静态方法实现》
《实践教你从零构建前端Lint工作流「干货」》
《高性能多级多选级联组件开发「JS篇」》
《深入浅出讲解Node.jsCLI工具最佳实战》
《延迟加载图像以提高Web网站性能的五种方法「实践」》
《比较JavaScript对象的四种方式「实践」》
《使用ServiceWorker让你的Web应用如虎添翼(上)「干货」》
《使用ServiceWorker让你的Web应用如虎添翼(中)「干货」》
《使用ServiceWorker让你的Web应用如虎添翼(下)「干货」》
《前端如何一次性处理10万条数据「进阶篇」》
《推荐三款正则可视化工具「JS篇」》
《如何让用户选择是否离开当前页面?「JS篇」》
《JavaScript开发人员更喜欢Deno的五大原因》
《仅用18行JavaScript实现一个倒数计时器》
《图文细说JavaScript的运行机制》
《一个轻量级JavaScript全文搜索库,轻松实现站内离线搜索》
《推荐Web程序员常用的15个源代码编辑器》
《10个实用的JS技巧「值得收藏」》
《细品269个JavaScript小函数,让你少加班熬夜(一)「值得收藏」》
《细品269个JavaScript小函数,让你少加班熬夜(二)「值得收藏」》
《细品269个JavaScript小函数,让你少加班熬夜(三)「值得收藏」》
《细品269个JavaScript小函数,让你少加班熬夜(四)「值得收藏」》
《细品269个JavaScript小函数,让你少加班熬夜(五)「值得收藏」》
《细品269个JavaScript小函数,让你少加班熬夜(六)「值得收藏」》
《深入JavaScript教你内存泄漏如何防范》
《手把手教你7个有趣的JavaScript项目-上「附源码」》
《手把手教你7个有趣的JavaScript项目-下「附源码」》
《JavaScript使用mediaDevicesAPI访问摄像头自拍》
《手把手教你前端代码如何做错误上报「JS篇」》
《一文让你彻底搞懂移动前端和Web前端区别在哪里》
《63个JavaScript正则大礼包「值得收藏」》
《提高你的JavaScript技能10个问答题》
《JavaScript图表库的5个首选》
《一文彻底搞懂JavaScript中Object.freeze与Object.seal的用法》
《可视化的JS:动态图演示-事件循环EventLoop的过程》
《教你如何用动态规划和贪心算法实现前端瀑布流布局「实践」》
《可视化的js:动态图演示Promises&Async/Await的过程》
《原生JS封装拖动验证滑块你会吗?「实践」》
《如何实现高性能的在线PDF预览》
《细说使用字体库加密数据-仿58同城》
《Node.js要完了吗?》
《Pug3.0.0正式发布,不再支持Node.js6/8》
《纯JS手写轮播图(代码逻辑清晰,通俗易懂)》
《JavaScript20年中文版之创立标准》
《值得收藏的前端常用60余种工具方法「JS篇」》
《箭头函数和常规函数之间的5个区别》
《通过发布/订阅的设计模式搞懂Node.js核心模块Events》
《「前端篇」不再为正则烦恼》
《「速围」Node.jsV14.3.0发布支持顶级Await和REPL增强功能》
《深入细品浏览器原理「流程图」》
《JavaScript已进入第三个时代,未来将何去何从?》
《前端上传前预览文件image、text、json、video、audio「实践」》
《深入细品EventLoop和浏览器渲染、帧动画、空闲回调的关系》
《推荐13个有用的JavaScript数组技巧「值得收藏」》
《前端必备基础知识:window.location详解》
《不要再依赖CommonJS了》
《犀牛书作者:最该忘记的JavaScript特性》
《36个工作中常用的JavaScript函数片段「值得收藏」》
《Node+H5实现大文件分片上传、断点续传》
《一文了解文件上传全过程(1.8w字深度解析)「前端进阶必备」》
《【实践总结】关于小程序挣脱枷锁实现批量上传》
《手把手教你前端的各种文件上传攻略和大文件断点续传》
《字节跳动面试官:请你实现一个大文件上传和断点续传》
《谈谈前端关于文件上传下载那些事【实践】》
《手把手教你如何编写一个前端图片压缩、方向纠正、预览、上传插件》
《最全的JavaScript模块化方案和工具》
《「前端进阶」JS中的内存管理》
《JavaScript正则深入以及10个非常有意思的正则实战》
《前端面试者经常忽视的一道JavaScript面试题》
《一行JS代码实现一个简单的模板字符串替换「实践」》
《JS代码是如何被压缩的「前端高级进阶」》
《前端开发规范:命名规范、html规范、css规范、js规范》
《【规范篇】前端团队代码规范最佳实践》
《100个原生JavaScript代码片段知识点详细汇总【实践】》
《关于前端174道JavaScript知识点汇总(一)》
《关于前端174道JavaScript知识点汇总(二)》
《关于前端174道JavaScript知识点汇总(三)》
《几个非常有意思的javascript知识点总结【实践】》
《都2020年了,你还不会JavaScript装饰器?》
《JavaScript实现图片合成下载》
《70个JavaScript知识点详细总结(上)【实践】》
《70个JavaScript知识点详细总结(下)【实践】》
《开源了一个JavaScript版敏感词过滤库》
《送你43道JavaScript面试题》
《3个很棒的小众JavaScript库,你值得拥有》
《手把手教你深入巩固JavaScript知识体系【思维导图】》
《推荐7个很棒的JavaScript产品步骤引导库》
《Echa哥教你彻底弄懂JavaScript执行机制》
《一个合格的中级前端工程师需要掌握的28个JavaScript技巧》
《深入解析高频项目中运用到的知识点汇总【JS篇】》
《JavaScript工具函数大全【新】》
《从JavaScript中看设计模式(总结)》
《身份证号码的正则表达式及验证详解(JavaScript,Regex)》
《浏览器中实现JavaScript计时器的4种创新方式》
《Three.js动效方案》
《手把手教你常用的59个JS类方法》
《127个常用的JS代码片段,每段代码花30秒就能看懂-【上】》
《深入浅出讲解js深拷贝vs浅拷贝》
《手把手教你JS开发H5游戏【消灭星星】》
《深入浅出讲解JS中this/apply/call/bind巧妙用法【实践】》
《手把手教你全方位解读JS中this真正含义【实践】》
《书到用时方恨少,一大波JS开发工具函数来了》
《干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React)》
《手把手教你JS异步编程六种方案【实践】》
《让你减少加班的15条高效JS技巧知识点汇总【实践】》
《手把手教你JS开发H5游戏【黄金矿工】》
《手把手教你JS实现监控浏览器上下左右滚动》
《JS经典实例知识点整理汇总【实践】》
《2.6万字JS干货分享,带你领略前端魅力【基础篇】》
《2.6万字JS干货分享,带你领略前端魅力【实践篇】》
《简单几步让你的JS写得更漂亮》
《恭喜你获得治疗JSthis的详细药方》
《谈谈前端关于文件上传下载那些事【实践】》
《面试中教你绕过关于JavaScript作用域的5个坑》
《Jquery插件(常用的插件库)》
《【JS】如何防止重复发送ajax请求》
《JavaScript+Canvas实现自定义画板》
《Continuation在JS中的应用「前端篇」》
作者|Deven
译者|王强
策划|小智
转发链接:https://mp.weixin.qq.com/s/Lw4D7bfUSw_kPoJMD6W8gg
本文主要介绍了关于js是什么意思?(前端开发需要知道7种常用的JavaScript设计模式)的相关养殖或种植技术,综合百科栏目还介绍了该行业生产经营方式及经营管理,关注综合百科发展动向,注重系统性、科学性、实用性和先进性,内容全面新颖、重点突出、通俗易懂,全面给您讲解综合百科技术怎么管理的要点,是您综合百科致富的点金石。
以上文章来自互联网,不代表本人立场,如需删除,请注明该网址:http://23.234.50.4:8411/article/97623.html