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 相关文章推荐
JQuery的read函数与js的onload不同方式实现
Mar 18 Javascript
jQuery中fadeOut()方法用法实例
Dec 24 Javascript
jquery实现TAB选项卡鼠标经过带延迟效果的方法
Jul 27 Javascript
基于vue2实现左滑删除功能
Nov 28 Javascript
zTree 树插件实现全国五级地区点击后加载的示例
Feb 05 Javascript
小程序扫描普通链接二维码跳转小程序指定界面方法
May 07 Javascript
微信小程序绘制图片发送朋友圈
Jul 25 Javascript
微信小程序JS加载esmap地图的实例详解
Sep 04 Javascript
JavaScript函数IIFE使用详解
Oct 21 Javascript
JavaScript 中的无穷数(Infinity)详解
Feb 13 Javascript
js实现简单进度条效果
Mar 25 Javascript
JS使用setInterval计时器实现挑战10秒
Nov 08 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模板的朋友必看的很多个顶级PHP模板引擎比较分析
2008/05/26 PHP
mysql总结之explain
2012/02/27 PHP
php利用imagemagick实现复古老照片效果实例
2017/02/16 PHP
JavaScript中的对象化编程
2008/01/16 Javascript
使用jQuery同时控制四张图片的伸缩实现代码
2013/04/19 Javascript
js对象与打印对象分析比较
2013/04/23 Javascript
jqgrid 编辑添加功能详细解析
2013/11/08 Javascript
jquery选择器之属性过滤选择器详解
2014/01/27 Javascript
jQuery中:not选择器用法实例
2014/12/30 Javascript
如何用javascript计算文本框还能输入多少个字符
2015/07/29 Javascript
AngularJS使用angular-formly进行表单验证
2015/12/27 Javascript
jQuery过滤选择器用法示例
2016/09/12 Javascript
基于KO+BootStrap+MVC实现的分页控件代码分享
2016/11/07 Javascript
angularjs实现简单的购物车功能
2017/09/21 Javascript
vue router仿天猫底部导航栏功能
2017/10/18 Javascript
node.js博客项目开发手记
2018/03/16 Javascript
如何使用Javascript中的this关键字
2020/05/28 Javascript
JS中准确判断变量类型的方法
2020/06/01 Javascript
vue中用 async/await 来处理异步操作
2020/07/18 Javascript
python的类方法和静态方法
2014/12/13 Python
用Python中的字典来处理索引统计的方法
2015/05/05 Python
python smtplib发送带附件邮件小程序
2018/05/22 Python
Python3中关于cookie的创建与保存
2018/10/21 Python
Pycharm设置utf-8自动显示方法
2019/01/17 Python
python pycharm的安装及其使用
2019/10/11 Python
如何基于python操作json文件获取内容
2019/12/24 Python
基于 Python 实践感知器分类算法
2021/01/07 Python
CSS3制作酷炫的条纹背景
2017/11/09 HTML / CSS
英国领先的酒杯和水晶玻璃器皿制造商:Dartington Crystal
2019/06/23 全球购物
审核会计岗位职责
2013/11/08 职场文书
工作检讨书500字
2014/10/19 职场文书
小学班主任评语
2014/12/29 职场文书
中标通知书范本
2015/04/17 职场文书
2015新员工工作总结范文
2015/10/15 职场文书
java版 联机五子棋游戏
2022/05/04 Java/Android
Redis实现分布式锁的五种方法详解
2022/06/14 Redis