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同时提交多个Web表单的方法
Dec 26 Javascript
JavaScript中innerHTML,innerText,outerHTML的用法及区别
Sep 01 Javascript
学习javascript面向对象 理解javascript原型和原型链
Jan 04 Javascript
jQuery checkbox选中问题之prop与attr注意点分析
Nov 15 Javascript
javascript回调函数的概念理解与用法分析
May 27 Javascript
bootstrap表格内容过长时用省略号表示的解决方法
Nov 21 Javascript
JS函数节流和函数防抖问题分析
Dec 18 Javascript
vue引入ueditor及node后台配置详解
Jan 03 Javascript
Vue2.5学习笔记之如何在项目中使用和配置Vue
Sep 26 Javascript
axios取消请求的实践记录分享
Sep 26 Javascript
使用React代码动态生成栅格布局的方法
May 24 Javascript
解决Vue的文本编辑器 vue-quill-editor 小图标样式排布错乱问题
Aug 03 Javascript
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通用检测函数集合
2006/11/25 PHP
php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
2011/07/29 PHP
php循环语句 for()与foreach()用法区别介绍
2012/09/05 PHP
thinkphp3.x中display方法及show方法的用法实例
2016/05/19 PHP
php好代码风格的阶段性总结
2016/06/25 PHP
PHP获取用户客户端真实IP的解决方案
2016/10/10 PHP
Javascript 通过json自动生成Dom的代码
2010/04/01 Javascript
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
jQuery EasyUI NumberBox(数字框)的用法
2010/07/08 Javascript
基于JQuery的类似新浪微博展示信息效果的代码
2012/07/23 Javascript
HTML页面弹出居中可拖拽的自定义窗口层
2014/05/07 Javascript
jquery实现简单的二级导航下拉菜单效果
2015/09/07 Javascript
javascript计时器编写过程与实现方法
2016/02/29 Javascript
浅析jquery与checkbox的checked属性的问题
2016/04/27 Javascript
基于javascript实现按圆形排列DIV元素(二)
2016/12/02 Javascript
在Vue 中使用Typescript的示例代码
2018/09/10 Javascript
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
Python 中的 else详解
2016/04/23 Python
Django自定义manage命令实例代码
2018/02/11 Python
解决python中 f.write写入中文出错的问题
2018/10/31 Python
Django+JS 实现点击头像即可更改头像的方法示例
2018/12/26 Python
python调用外部程序的实操步骤
2019/03/04 Python
python解压TAR文件至指定文件夹的实例
2019/06/10 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
python 哈希表实现简单python字典代码实例
2019/09/27 Python
TensorFlow绘制loss/accuracy曲线的实例
2020/01/21 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
2020/08/04 Python
如何用Python 加密文件
2020/09/10 Python
Currentbody法国:健康与美容高科技产品
2020/08/16 全球购物
致跳高运动员加油稿
2014/02/12 职场文书
稽核岗位职责
2015/02/10 职场文书
杨善洲电影观后感
2015/06/04 职场文书
小学生禁毒教育心得体会
2016/01/15 职场文书
演讲稿:​快乐,从不抱怨开始!
2019/04/02 职场文书
利用Python网络爬虫爬取各大音乐评论的代码
2021/04/13 Python
python实现手机推送 代码也就10行左右
2022/04/12 Python