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 相关文章推荐
PPK 谈 JavaScript 的 this 关键字 [翻译]
Sep 29 Javascript
JavaScript中使用Math.PI圆周率属性的方法
Jun 14 Javascript
Jquery uploadify上传插件使用详解
Jan 13 Javascript
jQuery实现点击弹出背景变暗遮罩效果实例代码
Jun 24 Javascript
微信小程序 progress组件详解及实例代码
Oct 25 Javascript
浅析Angular2子模块以及异步加载
Apr 24 Javascript
javascript用rem来做响应式开发
Jan 13 Javascript
使用vue + less 实现简单换肤功能的示例
Feb 21 Javascript
详解使用vue-admin-template的优化历程
May 20 Javascript
微信小程序实现批量倒计时功能
Nov 01 Javascript
el-select 下拉框多选实现全选的实现
Aug 02 Javascript
基于js实现逐步显示文字输出代码实例
Apr 02 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的十大要点(上)
2009/02/04 PHP
Zend Framework中的简单工厂模式 图文
2012/07/10 PHP
php中使用redis队列操作实例代码
2013/02/07 PHP
基于PHP创建Cookie数组的详解
2013/07/03 PHP
windows服务器中检测PHP SSL是否开启以及开启SSL的方法
2014/04/25 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
2014/05/08 PHP
php可生成缩略图的文件上传类实例
2014/12/17 PHP
PHP中使用imagick生成PSD文件缩略图教程
2015/01/26 PHP
Yii2框架操作数据库的方法分析【以mysql为例】
2019/05/27 PHP
Date对象格式化函数代码
2010/07/17 Javascript
JS嵌套函数调用上下文的问题解决
2014/03/26 Javascript
深入解析JavaScript编程中的this关键字使用
2015/11/09 Javascript
JavaScript实战之菜单特效
2016/08/16 Javascript
jQuery实现的放大镜效果示例
2016/09/13 Javascript
JS控制div跳转到指定的位置的几种解决方案总结
2016/11/05 Javascript
layui输入框只允许输入中文且判断长度的例子
2019/09/18 Javascript
详解三种方式在React中解决绑定this的作用域问题并传参
2020/08/18 Javascript
[04:29]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/02/01 DOTA
使用python调用浏览器并打开一个网址的例子
2014/06/05 Python
Python数据分析中Groupby用法之通过字典或Series进行分组的实例
2017/12/08 Python
Python Dataframe 指定多列去重、求差集的方法
2018/07/10 Python
python 文件查找及内容匹配方法
2018/10/25 Python
浅谈django rest jwt vue 跨域问题
2018/10/26 Python
django框架使用方法详解
2019/07/18 Python
Python中openpyxl实现vlookup函数的实例
2020/10/28 Python
python如何修改文件时间属性
2021/02/05 Python
皇马官方商城:Real Madrid Store
2016/09/02 全球购物
德国游戏机商店:Konsolenkost
2019/12/08 全球购物
演讲比赛获奖感言
2014/02/02 职场文书
讲文明树新风公益广告宣传方案
2014/02/25 职场文书
小学运动会口号
2014/06/07 职场文书
公司员工离职感言
2015/08/03 职场文书
2016年心理学教育培训学习心得体会
2016/01/12 职场文书
广告策划的实习心得体会总结!
2019/07/22 职场文书
七个Python必备的GUI库
2021/04/27 Python
tensorflow中的数据类型dtype用法说明
2021/05/26 Python