JavaScript设计模式之原型模式详情


Posted in Javascript onJune 21, 2022

前言

设计模式呢最多的可能是用到类,我们去通过类来封装一些实用的方法,通过设计模式去实现各个方法之间的解耦等,由于JS中的继承是用原型链继承的,所以原型模式是用原型实例指向创建对象的类,使用于创建新的对象的类共享原型对象的属性以及方法

案例

比如我们现在需要实现一个页面上的轮播图,可能需要用到对轮播图操作的方法,比如聚焦,切换,点击展开等动作,那么我们可以创一个图片轮播的方法,也可以叫做类

JavaScript设计模式之原型模式详情

上面这个方法只是一个基础的方法,但在实际操作中我们可能会有不同的各种各样的需求需要我们来实现,那样子我们就需要在基础功能上加上一些扩张来实现我们的需求,我们扩展的需要要依赖于我们的基础方法,比如切换图片的时候可能是上下方向的滑动,左右方向的滑动,也可能是自由方位的活动等功能,而且在图片滑动过程中的动画,比如渐变,大小缩放,都是可以拓展开的功能。

JavaScript设计模式之原型模式详情

JavaScript设计模式之原型模式详情

上面是在基础类上通过继承的方法去重写切换下一张图片的方法,这就是我们可以通过继承的方式去改变我们的基础扩展更多的方法,又节省了很多相同的地方,下面用一个实例来看一下

JavaScript设计模式之原型模式详情

回顾

回顾一下之前我们对于原型链继承的了解,我们会发现,如果我们将属性和函数都放在基础类的构造函数中,那么作为基础类会被我们扩展的功能继承,所以每一次继承都会调用构造函数中的方法,那么可能在一定程度上会影响系统的性能,我们可以将一些性能消耗大的放到原型上面,简单但有差异的东西可以放到构造函数中

JavaScript设计模式之原型模式详情

JavaScript设计模式之原型模式详情

JavaScript设计模式之原型模式详情

小结:

原型模式就是将可复用的、可共享的、耗时大的从基类中提出来然后放在其原型中,然后子类通过组合继承或者寄生组合式继承而将方法和属性继承下来,对于子类中那些需要重写的方法进行重写,这样子类创建的对象既具有子类的属性和方法也共享了基类的原型方法

原型的这种设计模式,是一种比较简单的设计模式,由于初始化都做一些重复性的东西,造成的性能消耗。为了提高性能创建一种共享机制,这样每当创建基类时,对于每次创建的一些简单而又差异化的属性我们可以放在构造函数中,而我们将一些消耗资源比较大的方法放在基类的原型中,这样就会避免很多不必要的消耗,这也就是原型模式的一个雏形

原型的拓展

原型对象是一个共享的对象,不论是父类的实例对象或者是子类的继承,都是对它的一个指向引用,所以原型对象才会被共享。既然被共享,那么对原型对象的拓展,不论是子类或者父类的实例对象都会继承下来

JavaScript设计模式之原型模式详情

由于俩个子类都继承同一个父类,所以在原型上声明方法的时候,由于原型对象是一个共享的对象,指向同一个引用,所以一个子类可以访问到另一个子类在原型上声明的方法,虽然这种做法比较自由,可以有较高的拓展性,但同时也不能随意使用,否则可能会影响到其他实例的属性或者是方法,这样做是一个比较低效的操作。

但如创建一个实例对象的构造函数比较复杂,或者耗时比较长,最好不要用new关键字去复制这些基类,但可以通过对这些对象属性或者方法进行复制来实现创建,如果涉及多个对象,我们也可以通过原型模式来实现对新对象的创建。那么首先要有一个原型模式的对象复制方法。

JavaScript设计模式之原型模式详情

上面这个函数为我们提供了复制原型的方法,通过去获取另一个构造函数的模板属性,遍历到另一个构造函数中,最后通过new返回这个复制的新的构造函数

比如我们现在创建了一个构造函数,这个构造函数没有基类,只是一些属性和方法的模板对象,我们就可以通过复制的方法来实现构造出一个新的构造函数

JavaScript设计模式之原型模式详情

并且由于我们定义复制函数时候已经有new结果的返回,所以但我们在使用的时候,就可以直接使用方法,而不需要通过new 去实现

JavaScript设计模式之原型模式详情

到此这篇关于JavaScript设计模式之原型模式详情的文章就介绍到这了,更多相关JS原型模式内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
js 蒙版进度条(结合图片)
Mar 10 Javascript
理解JavaScript中的对象 推荐
Jan 09 Javascript
js data日期初始化的5种方法
Dec 29 Javascript
让jQuery Mobile不显示讨厌loading界面的方法
Feb 19 Javascript
require.js深入了解 require.js特性介绍
Sep 04 Javascript
node.js中的buffer.toJSON方法使用说明
Dec 14 Javascript
JavaScript模拟实现继承的方法
Mar 30 Javascript
JavaScript中数据结构与算法(四):串(BF)
Jun 19 Javascript
详解基于vue的服务端渲染框架NUXT
Jun 20 Javascript
JavaScript实现异步图像上传功能
Jul 12 Javascript
bootstrap 日期控件 datepicker被弹出框dialog覆盖的解决办法
Jul 09 Javascript
微信小程序返回上一级页面的实现代码
Jun 19 Javascript
js前端设计模式优化50%表单校验代码示例
微前端qiankun改造日渐庞大的项目教程
Jun 21 #Javascript
JavaScript架构localStorage特殊场景下二次封装操作
Jun 21 #Javascript
js前端图片加载异常兜底方案
Jun 21 #Javascript
JavaScript中10个Reduce常用场景技巧
Jun 21 #Javascript
js前端面试常见浏览器缓存强缓存及协商缓存实例
Jun 21 #Javascript
JavaScript前端面试组合函数
Jun 21 #Javascript
You might like
PHP 微信支付类 demo
2015/11/30 PHP
javascript dom 基本操作小结
2010/04/11 Javascript
关于jquery性能最佳实践的讨论,与求教
2012/03/30 Javascript
扩展JavaScript功能的正确方法(译文)
2012/04/12 Javascript
jQuery使用技巧简单汇总
2013/04/18 Javascript
网页前端优化之滚动延时加载图片示例
2013/07/13 Javascript
ajax提交表单实现网页无刷新注册示例
2014/05/08 Javascript
jquery对象和javascript对象即DOM对象相互转换
2014/08/07 Javascript
Javascript核心读书有感之表达式和运算符
2015/02/11 Javascript
jQuery中slideUp 和 slideDown 的点击事件
2015/02/26 Javascript
jQuery Validate初步体验(一)
2015/12/12 Javascript
AngularJS 与百度地图的结合实例
2016/10/20 Javascript
AngularJS动态菜单操作指令
2017/04/25 Javascript
详解webpack+ES6+Sass搭建多页面应用
2018/11/05 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
[02:20]2014DOTA2西雅图邀请赛 MVP外卡赛首胜采访
2014/07/09 DOTA
Python制作数据导入导出工具
2015/07/31 Python
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
2017/03/20 Python
Python实现Linux的find命令实例分享
2017/06/04 Python
分享一下Python数据分析常用的8款工具
2018/04/29 Python
运用PyTorch动手搭建一个共享单车预测器
2019/08/06 Python
PyCharm搭建Spark开发环境的实现步骤
2019/09/05 Python
python运用pygame库实现双人弹球小游戏
2019/11/25 Python
对python中各个response的使用说明
2020/03/28 Python
Selenium获取登录Cookies并添加Cookies自动登录的方法
2020/12/04 Python
HTML5 canvas基本绘图之绘制五角星
2016/06/27 HTML / CSS
锐步英国官网:Reebok英国
2019/11/29 全球购物
力学专业毕业生自荐信
2013/11/17 职场文书
初中数学教学反思
2014/01/16 职场文书
上课迟到检讨书300字
2014/10/15 职场文书
六年级学生期末评语
2014/12/26 职场文书
领导干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
大学生干部培训心得体会
2016/01/06 职场文书
2016年暑期社会实践活动总结报告
2016/04/06 职场文书
节约用水广告语60条
2019/11/14 职场文书
如何使用Maxwell实时同步mysql数据
2021/04/08 MySQL