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 事件绑定问题
Jan 01 Javascript
JavaScript中for..in循环陷阱介绍
Nov 12 Javascript
js复制网页内容并兼容各主流浏览器的代码
Dec 17 Javascript
js中匿名函数的创建与调用方法分析
Dec 19 Javascript
javascript中sort() 方法使用详解
Aug 30 Javascript
轻松实现jquery选项卡切换效果
Oct 10 Javascript
基于KO+BootStrap+MVC实现的分页控件代码分享
Nov 07 Javascript
angularjs中回车键触发某一事件的方法
Apr 24 Javascript
vue中动态绑定表单元素的属性方法
Feb 23 Javascript
JavaScript变量声明var,let.const及区别浅析
Apr 23 Javascript
React中使用UEditor百度富文本的方法
Aug 22 Javascript
jQuery实现的简单手风琴效果示例
Aug 29 jQuery
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
dedecms后台验证码总提示错误的解决方法
2007/03/21 PHP
php排序算法(冒泡排序,快速排序)
2012/10/09 PHP
php生成RSS订阅的方法
2015/02/13 PHP
经典的带阴影的可拖动的浮动层
2006/06/26 Javascript
Javascript学习笔记4 Eval函数
2010/01/11 Javascript
jQuery 表单验证扩展代码(二)
2010/10/20 Javascript
javascript使用switch case实现动态改变超级链接文字及地址
2014/12/16 Javascript
你有必要知道的25个JavaScript面试题
2015/12/29 Javascript
angularjs封装bootstrap时间插件datetimepicker
2016/06/20 Javascript
javascript加载xml 并解析各节点的值(实现方法)
2016/10/12 Javascript
JavaScript实现按键精灵的原理分析
2017/02/21 Javascript
一篇文章让你彻底弄懂JS的事件冒泡和事件捕获
2017/08/14 Javascript
JS实现select选中option触发事件操作示例
2018/07/13 Javascript
js实现GIF动图分解成多帧图片上传
2019/10/24 Javascript
[02:23]DOTA2英雄基础教程 幻影长矛手
2013/12/09 DOTA
[05:07]DOTA2英雄梦之声_第14期_暗影恶魔
2014/06/20 DOTA
pygame播放音乐的方法
2015/05/19 Python
Python网站验证码识别
2016/01/25 Python
如何优雅地改进Django中的模板碎片缓存详解
2018/07/04 Python
pycharm 实现显示project 选项卡的方法
2019/01/17 Python
python实现简单颜色识别程序
2020/02/19 Python
python调用有道智云API实现文件批量翻译
2020/10/10 Python
python字典按照value排序方法
2020/12/28 Python
英国、欧洲和全球租车服务:Avis英国
2016/08/29 全球购物
春秋航空官方网站:Spring Airlines
2017/09/27 全球购物
奠基仪式主持词
2014/03/20 职场文书
安全横幅标语
2014/06/09 职场文书
餐饮服务食品安全责任书
2014/07/25 职场文书
关于运动会广播稿50字
2014/10/18 职场文书
龙潭大峡谷导游词
2015/02/10 职场文书
英文导游词
2015/02/13 职场文书
回复函范文
2015/07/14 职场文书
python基础学习之生成器与文件系统知识总结
2021/05/25 Python
2022新作动画《福星小子》释出宣传影片 加入内田真礼&宫野真守配音演出
2022/04/08 日漫
JS精髓原型链继承及构造函数继承问题纠正
2022/06/16 Javascript
Python绘制散点图之可视化神器pyecharts
2022/07/07 Python