JavaScript设计模式初探


Posted in Javascript onJanuary 07, 2016

目的:设计模式众多,尝试记录下学到的不同设计模式的优劣,方便以后查阅。

前言:半年前看高程的时候看到设计模式这章,云里雾里,不是看不明白,而是不明白为啥要如此麻烦只为创建一个对象。直到最近完成了自己第一个小项目,才体会到当代码量多起来时没有适当的规范与限制是多么大的灾难。于是重新翻开高程,总结下几种我学到的简单设计模式的优劣。

正文:本文一共介绍7种设计模式以及他们的应用场景、优劣。

1.工厂模式

直接用函数来封装对象,将对象作为返回值。

function person (name,age) {
  var obj=new Object();
  obj.name=name;
  obj.age=age;
  obj.sayName=function () {
    alert(this.name);
  };
  return obj;
}
var me=person("Su",25);

缺点:对象识别的问题,所有创建出的对象都是Object的实例,不好区分。

2.构造函数模式

function Person (name,age) {
  this.name=name;
  this.age=age;
  this.sayName=function () {
    alert(this.name);
  };
}
var me=new Person("Su",25);

优点:运用构造函数模式可以将实例标示为一种特定的类型。

缺点:创建的对象的方法都是私有的,如果只是想产生公用的方法,会造成不必要的性能浪费。

3.原型模式

利用原型链继承

function Person () {}
Person.prototype.name="Su";
Person.prototype.sayName=function () {
alert(this.name);}
var me =new Person();

缺点:所有属性和方法被实例共享。当属性、方法中包含引用类型的值时,修改一个实例的属性、方法会影响所有其他实例。

4.原型+构造函数模式

私有属性、方法用构造函数产生,公有属性、方法用原型来继承。融合两种方法的优点。

function Person (name,age) {
  this.name=name;
  this.age=age;
}
Person.prototype={
  constructor:Person,
  sayName:function () {
      alert(this.name);
  }
}
var me=new Person("Su",25);

缺点:注意引用类型值的原型继承。

ps:上图代码重写了Person构造函数的原型对象,将原型对象指针指向了一个对象,所以constructor属性此时指向Object而不是Person,所以要显式的将其设置成Person。

5.动态原型模式

本质上还是构造函数,只在指定方法不存在时在原型对象中添加他。

function Person (name,age) {
  this.name=name;
  this.age=age;
  if (typeof this.sayName!="function") {
    Person.prototype.sayName=function () {
      alert(this.name);
    }
  }
}
var me =new Person("Su",25);

缺点:不能使用对象字面量重写原型对象。因为这会使实例的指针指向新的原型对象。也就是说上图中原型对象中添加的sayName方法会失效。

6.寄生构造函数模式

 调用时使用new操作符,除此以外我看不出和工厂模式有什么区别。望高人指点。

function person (name,age) {
  var obj=new Object();
  obj.name=name;
  obj.age=age;
  obj.sayName=function () {
    alert(this.name);
  };
  return obj;
}
var me=new person("Su",25); //这里使用new操作符

7.稳妥构造函数模式

没有公共属性,禁用this,仅暴露必须的API用于数据调用。适用于对安全有需求的领域。

function Person (name) {
 var o=new Object();
 o.sayName=function () {
 alert(name);  
 }  
 return o;
}
var me=Person("Su");

如上代码,只能通过sayName方法才能访问到内部的name属性。

本文给大家介绍了七种设计模式,分别介绍了他们的优缺点,希望对学习js设计模式相关知识有所帮助。

Javascript 相关文章推荐
JavaScript中window.showModalDialog()用法详解
Dec 18 Javascript
JS运动基础框架实例分析
Mar 03 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
May 21 Javascript
利用原生js和jQuery实现单选框的勾选和取消操作的方法
Sep 04 Javascript
JS中用三种方式实现导航菜单中的二级下拉菜单
Oct 31 Javascript
Node.js学习入门
Jan 03 Javascript
Ionic2开发环境搭建教程
Aug 20 Javascript
JS基于递归实现网页版计算器的方法分析
Dec 20 Javascript
React中使用外部样式的3种方式(小结)
May 28 Javascript
jQuery--遍历操作实例小结【后代、同胞及过滤】
May 22 jQuery
vue 递归组件的简单使用示例
Jan 14 Vue.js
一篇文章告诉你如何实现Vue前端分页和后端分页
Feb 18 Vue.js
JavaScript类型系统之Object详解
Jan 07 #Javascript
7个去伪存真的JavaScript面试题
Jan 07 #Javascript
jQuery表格插件datatables用法详解
Nov 23 #Javascript
详解JavaScript UTC时间转换方法
Jan 07 #Javascript
jQuery formValidator表单验证
Jan 07 #Javascript
JavaScript中的原始值和复杂值
Jan 07 #Javascript
理解JS事件循环
Jan 07 #Javascript
You might like
PHP图片处理之使用imagecopyresampled函数实现图片缩放例子
2014/11/19 PHP
分享一段PHP制作的中文拼音首字母工具类
2014/12/11 PHP
PHP+MySQL实现的简单投票系统实例
2016/02/24 PHP
PHP二分查找算法示例【递归与非递归方法】
2016/09/29 PHP
Joomla框架实现字符串截取的方法示例
2017/07/18 PHP
Javascript document.referrer判断访客来源网址
2020/05/15 Javascript
jquery中获取id值方法小结
2013/09/22 Javascript
JavaScript面向对象编程入门教程
2014/04/16 Javascript
js获取时间并实现字符串和时间戳之间的转换
2015/01/05 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
2015/03/04 Javascript
js实现精美的图片跟随鼠标效果实例
2015/05/16 Javascript
多个js毫秒倒计时同时进行效果
2016/01/05 Javascript
JS中使用FormData上传文件、图片的方法
2016/08/07 Javascript
js创建对象几种方式的优缺点对比
2016/09/28 Javascript
微信小程序 Record API详解及实例代码
2016/09/30 Javascript
AngularJS实现的2048小游戏功能【附源码下载】
2018/01/03 Javascript
微信开发之企业付款到银行卡接口开发的示例代码
2018/09/18 Javascript
JS防抖和节流实例解析
2019/09/24 Javascript
vuex分模块后,实现获取state的值
2020/07/26 Javascript
JS实现可以用键盘方向键控制的动画
2020/12/11 Javascript
分析Python编程时利用wxPython来支持多线程的方法
2015/04/07 Python
使用Py2Exe for Python3创建自己的exe程序示例
2018/10/31 Python
浅谈Python 多进程默认不能共享全局变量的问题
2019/01/11 Python
python七夕浪漫表白源码
2019/04/05 Python
Django外键(ForeignKey)操作以及related_name的作用详解
2019/07/29 Python
python 并发编程 多路复用IO模型详解
2019/08/20 Python
通过实例简单了解Python sys.argv[]使用方法
2020/08/04 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
2020/11/05 Python
wordpress添加Html5的表单验证required方法小结
2020/08/18 HTML / CSS
财经学院自荐信范文
2014/02/02 职场文书
党员干部承诺书范文
2014/03/25 职场文书
意向书范本
2014/07/29 职场文书
教师党的群众路线对照检查材料
2014/09/24 职场文书
家属慰问信
2015/02/14 职场文书
2015年科协工作总结
2015/05/19 职场文书
淮海战役观后感
2015/06/11 职场文书