JavaScript-设计模式(四) 原型模式

定义:原型模式(Prototype pattern)指的是使用一个原型的实例为模板,通过复制一个已经存在的实例来返回新的实例,而不是从头开始新建实例。原型模式是一种对象创建型模式。

解释

原型模式不仅是一种设计模式,它还是一种编程范式(programming paradigm),是 JavaScript 面向对象系统实现的根基。

使用场景

原型模式用于在创建对象时,通过共享某个对象原型的属性和方法,从而达到提高性能、降低内存占用、代码复用的效果。

实现一个简单的原型模式:

// ES5
function Person(n,a){this.name =  nthis.age = a}Person.prototype.say = function (){console.log(this.name,this.age)}// 继承function Teacher(n,a,id){// 私有属性继承Person.call(this,n,a)// 新增私有属性this.id = id}Teacher.prototype = new Person()Teacher.prototype.sayID = function (){console.log(this.id)}let goudan = new Person('狗蛋',18)let hundan = new Teacher('lalal',20,889)hundan.say()hundan.sayID()

当前存在一个缺陷 ,当前的Teacher创建的实例原型上仍然存在构造函数Person的私有属性,改进如下:

// ES5
function Person(n,a){this.name =  nthis.age = a}Person.prototype.say = function (){console.log(this.name,this.age)}// 继承function Teacher(n,a,id){// 私有属性继承Person.call(this,n,a)// 新增私有属性this.id = id}function Fn (){}Fn.prototype = Person.prototypeTeacher.prototype = new Fn()// 绑定构造函数 Teacher.prototype.constructor = Teacher()Teacher.prototype.sayID = function (){console.log(this.id)}let goudan = new Person('狗蛋',18)let hundan = new Teacher('lalal',20,889)hundan.say()hundan.sayID()

在ES6 中,可以直接通过extends 关键字 去继承

// ES6
class Person{constructor(n,a) {this.name = nthis.a = a}}// 继承class Teacher extends Person{constructor(n,a,id) {super(n,a);this.id = id}sayID(){console.log(this.name,this.id)}}let hunqiu = new Teacher('老师','18',1)hunqiu.sayID()

ES6 class 语法糖,省略了太多复杂的内容~

优缺点

优点:

  • 减少内存消耗, 系统资源占用少, 所有实例共享同一方法, 不会创建多个
  • 拓展性比较好。原型对象继承时, 子类在重写父类原型方法时很方便, 可以很方便 调父类房法, 再扩展。

缺点:

  • 优点1既是最大的优点, 也同样带来一个严重问题, 如果共享的对象是引用 对象( 如array) 则也会造成多个实例共享同一个array, 很可能会相互影响。
  • 对已有类进行改造时需要修改源代码,违背了开关原则。

总结

js 在创建对象比较消耗内存、耗时长,可以通过减少内部属性创建的方式降低内存占用。

而原型模式就是使用 javascript 语言的原型特性进行相同属性的共享,从而达到降低内存占用、提高对象创建效率。

JavaScript-设计模式(四) 原型模式相关推荐

  1. 设计模式(7)[JS版]-JavaScript设计模式之原型模式如何实现???

    目录 1.什么是原型模式 2 参与者 3 实例讲解 4 使用 Object.create实现原型模式 4.1 Object.create()的用法 4.2 用 Object.create实现继承 4. ...

  2. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

  3. JavaScript为什么使用原型模式而不是类模式

    导言: 作为JavaScript初学者的本菜鸡而言,刚一开始接触这门语言我就被他的原型模式给吓到了.并且在相当长的一段时间之内,我都完全不能理解或者不能接受这个模式.直到最近经过多方调查和思考才有所明 ...

  4. C#设计模式(6)——原型模式(Prototype Pattern)

    一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...

  5. 设计模式回顾——原型模式(C++)

    文章目录 1 前言 2 什么是原型模式 2.1 原型模式组成 2.2 原型模式UML图 2.3 原型模式作用 3 原型模式优缺点 4 什么地方使用原型模式 5 原型模式实现 6 原型模式与构造函数 1 ...

  6. 【GOF23设计模式】原型模式

    [GOF23设计模式]原型模式 来源:http://www.bjsxt.com/  一.[GOF23设计模式]_原型模式.prototype.浅复制.深复制.Cloneable接口  浅复制 1 pa ...

  7. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:webabcd 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. ...

  8. 教你如何一篇博客读懂设计模式之—--原型模式

    教你如何一篇博客读懂设计模式之----原型模式 what:是什么 原型模式: 用于创建重复的对象,既不用一个属性一个属性去set和get,又不影响性能,原型模式产生的对象和原有的对象不是同一个实例,他 ...

  9. 二十三种设计模式之原型模式

    今天继续探讨GOF二十三种设计模式的原型模式,原型模式也是属于创建型模式的一种 原型模式通俗的讲就是对象复制的过程,即通过一个原型对象,我可以得到一个该对象的克隆. 下面来看下原型模式的第一种写法-- ...

最新文章

  1. 使用libFuzzer fuzz Chrome V8入门指南
  2. python语言采用编译执行方式_Python程序的执行过程 解释型语言和编译型语言
  3. javaweb学习总结(十六)——JSP指令
  4. micropython会商用吗_NSF商用食品设备认证解析
  5. 介绍一个好用的日期倒计时工具
  6. 学习笔记(48):Python实战编程-grid布局
  7. C/C++ 交换两个数,不使用第三个变量, 函数模板来实现
  8. mysql5.7运行按钮_MySQL 5.7.* 启动问题
  9. 开源 免费 java CMS - FreeCMS2.1 菜单管理
  10. 未为dll加载任何符号_专家发现aspersky 和Trend Micro安全性解决方案中的DLL劫持问题...
  11. 心得18--JavaWEB国际化类和jstl对应的标签案例分析
  12. PHP版本李白打酒算法
  13. Java之加密(信息摘要)工具类(依赖:java.security.MessageDigest或org.apache.commons.codec.digest.DigestUtils)...
  14. 关于Latent Dirichlet Allocation及Hierarchical LDA模型的必读文章和相关代码
  15. windows使用放大镜快速放大屏幕局部
  16. DDR2芯片内部终结ODT技术解析
  17. 发生致命事故8个月后,优步被获准在匹兹堡恢复自动驾驶测试
  18. 慢慢来,一切都来得及
  19. java comp_Java EE异常:名称java:comp未在此上下文中绑定
  20. adb server is out of date 最新解决方案

热门文章

  1. sql 凭证明细表 科目余额表_金碟财务软件手册——明细账 凭证汇总表 科目余额表...
  2. Spark 学习入门教程
  3. 【图像去噪】兴智杯论文复现赛——NAFNet
  4. 无限宝服务器40,无限宝互动平台电脑版
  5. 程序猿必备的数电知识之(逻辑代数基础后半篇)
  6. C++函数指针与成员函数指针
  7. 安卓handler的用法,handler举例
  8. Android开发入门到实战精通 完整全套开发教程送给你
  9. android telephonymanager 电话状态,TelephonyManager类:Android手机及Sim卡状态的获取
  10. tcp/ip详解卷一总结