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 03 Javascript
jquery衣服颜色选取插件效果代码分享
Aug 28 Javascript
基于jquery实现百度新闻导航菜单滑动动画
Mar 15 Javascript
Js删除数组中某一项或几项的几种方法(推荐)
Jul 27 Javascript
javascript 解决浏览器不支持的问题
Sep 24 Javascript
jQuery事件与动画基础详解
Feb 23 Javascript
vue-cli如何快速构建vue项目
Apr 26 Javascript
vue-cli项目中怎么使用mock数据
Sep 27 Javascript
vue.js  父向子组件传参的实例代码
Oct 29 Javascript
vue-star评星组件开发实例
Mar 01 Javascript
p5.js临摹动态图形的方法
Oct 23 Javascript
如何区分vue中的v-show 与 v-if
Sep 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简单开启gzip压缩方法(zlib.output_compression)
2013/04/13 PHP
PHP设计模式之责任链模式的深入解析
2013/06/13 PHP
php文件上传简单实现方法
2015/01/24 PHP
Zend Framework动作助手Json用法实例分析
2016/03/05 PHP
PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
2016/05/06 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
2019/08/03 PHP
javascript 面向对象全新理练之继承与多态
2009/12/03 Javascript
jQuery对表单元素的取值和赋值操作代码
2011/05/19 Javascript
如何制作浮动广告 JavaScript制作浮动广告代码
2012/12/30 Javascript
JQuery+DIV自定义滚动条样式的具体实现
2013/06/25 Javascript
jQuery中$.click()无效问题分析
2015/01/29 Javascript
JavaScript实现找质数代码分享
2015/03/24 Javascript
JavaScript中的Function函数
2015/08/27 Javascript
JavaScript获取客户端IP的方法(新方法)
2016/03/11 Javascript
Vue.JS入门教程之自定义指令
2016/12/08 Javascript
vue做网页开场视频的实例代码
2017/10/20 Javascript
详解Vue CLI3配置之filenameHashing使用和源码设计使用和源码设计
2018/08/31 Javascript
angular 服务的单例模式(依赖注入模式下)详解
2018/10/22 Javascript
JS开发常用工具函数(小结)
2019/07/04 Javascript
微信公众号平台接口开发 菜单管理的实现
2019/08/14 Javascript
vue路由切换之淡入淡出的简单实现
2019/10/31 Javascript
[19:24]DOTA2客户端使用指南 一分钟快速设置轻松超神
2013/09/24 DOTA
Python接收Gmail新邮件并发送到gtalk的方法
2015/03/10 Python
Python实现mysql数据库更新表数据接口的功能
2017/11/19 Python
python lambda表达式(匿名函数)写法解析
2019/09/16 Python
详解HTML5 LocalStorage 本地存储
2016/12/23 HTML / CSS
美国快时尚彩妆品牌:Winky Lux(透明花瓣润唇膏)
2018/11/06 全球购物
豪华床上用品 :Jennifer Adams
2019/09/15 全球购物
室内设计实习自我鉴定
2013/09/25 职场文书
外语系大学生自荐信范文
2014/03/01 职场文书
保密承诺书范文
2014/03/27 职场文书
法院执行局工作总结
2015/08/11 职场文书
2016年社会主义核心价值观心得体会
2016/01/21 职场文书
SQL 聚合、分组和排序
2021/11/11 MySQL
JavaScript原型链中函数和对象的理解
2022/06/16 Javascript
Docker容器harbor私有仓库部署和管理
2022/08/05 Servers