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 相关文章推荐
javascript使用eval或者new Function进行语法检查
Oct 16 Javascript
jquery入门—数据删除与隔行变色以及图片预览
Jan 07 Javascript
js控制容器隐藏出现防止样式变化的两种方法
Apr 25 Javascript
Javascript简单改变表单元素背景的方法
Jul 15 Javascript
AngularJS入门心得之directive和controller通信过程
Jan 25 Javascript
微信JS接口大全
Aug 25 Javascript
Angularjs实现mvvm式的选项卡示例代码
Sep 08 Javascript
JavaScript运动框架 解决防抖动问题、悬浮对联(二)
May 17 Javascript
vue系列之动态路由详解【原创】
Sep 10 Javascript
防止页面url缓存中ajax中post请求的处理方法
Oct 10 Javascript
vue路由跳转传参数的方法
May 06 Javascript
微信小程序Page中data数据操作和函数调用方法
May 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
在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载)
2010/05/04 PHP
php启用zlib压缩文件的配置方法
2013/06/12 PHP
php中simplexml_load_string使用实例分享
2014/02/13 PHP
php实现批量下载百度云盘文件例子分享
2014/04/10 PHP
PHP购物车类Cart.class.php定义与用法示例
2016/07/20 PHP
Javascript动态绑定事件的简单实现代码
2010/12/25 Javascript
a标签的href与onclick事件的区别详解
2014/11/12 Javascript
jquery实现的横向二级导航效果代码
2015/08/26 Javascript
jquery实现select选择框内容左右移动代码分享
2015/11/21 Javascript
Node.js实现JS文件合并小工具
2016/02/02 Javascript
BootStrap Validator使用注意事项(必看篇)
2016/09/28 Javascript
ros::spin() 和 ros::spinOnce()函数的区别及详解
2016/10/01 Javascript
浅谈javascript的url参数parse和build函数
2017/03/04 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
2017/04/21 Javascript
基于webpack 实用配置方法总结
2017/09/28 Javascript
详解Axios统一错误处理与后置
2018/09/26 Javascript
js cavans实现静态滚动弹幕
2020/05/21 Javascript
[50:48]LGD vs CHAOS 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
[11:44]Ti9 OG夺冠时刻
2019/08/25 DOTA
Python面向对象class类属性及子类用法分析
2018/02/02 Python
python 地图经纬度转换、纠偏的实例代码
2018/08/06 Python
对python生成业务报表的实例详解
2019/02/03 Python
python添加菜单图文讲解
2019/06/04 Python
Pycharm如何打断点的方法步骤
2019/06/13 Python
解决python中的幂函数、指数函数问题
2019/11/25 Python
Python中顺序表原理与实现方法详解
2019/12/03 Python
jupyter notebook的安装与使用详解
2020/05/18 Python
Python数据可视化实现多种图例代码详解
2020/07/14 Python
中东地区最大的奢侈品市场:The Luxury Closet
2019/04/09 全球购物
美国优质马术服装购买网站:Breeches.com
2019/12/16 全球购物
nohup的用法
2012/11/26 面试题
施工人员岗位职责
2013/12/12 职场文书
绩效工资分配方案
2014/01/18 职场文书
骨干教师申报材料
2014/12/17 职场文书
谢师宴邀请函
2015/02/02 职场文书
openstack中的rpc远程调用的方法
2021/07/09 Python