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 相关文章推荐
Jquery中的层次选择器与find()的区别示例介绍
Feb 20 Javascript
jquery延迟对象解析
Oct 26 Javascript
原生js编写2048小游戏
Mar 17 Javascript
JavaScript学习笔记之惰性函数示例详解
Aug 27 Javascript
JavaScript实现重力下落与弹性效果的方法分析
Dec 20 Javascript
js生成word中图片处理方法
Jan 06 Javascript
Angular 容器部署的方法
Apr 17 Javascript
video.js 实现视频只能后退不能快进的思路详解
Aug 09 Javascript
jQuery实现的模仿雨滴下落动画效果
Dec 11 jQuery
js中的面向对象之对象常见创建方法详解
Dec 16 Javascript
Vue-axios-post数据后端接不到问题解决
Jan 09 Javascript
浅谈JavaScript浅拷贝和深拷贝
Nov 07 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手册及PHP编程标准
2006/12/17 PHP
ThinkPHP实例化模型的四种方法概述
2014/08/22 PHP
CentOS 安装 PHP5.5+Redis+XDebug+Nginx+MySQL全纪录
2015/03/25 PHP
php微信开发之图片回复功能
2018/06/14 PHP
Laravel框架基于ajax和layer.js实现无刷新删除功能示例
2019/01/17 PHP
Laravel框架Blade模板简介及模板继承用法分析
2019/12/03 PHP
javascript 播放器 控制
2007/01/22 Javascript
javascript arguments 传递给函数的隐含参数
2009/08/21 Javascript
JQuery获取各种宽度、高度(format函数)实例
2013/03/04 Javascript
JavaScript异步编程:异步数据收集的具体方法
2013/08/19 Javascript
javascript中函数作为参数调用的方法
2015/02/09 Javascript
ECMAScript6中Set/WeakSet详解
2015/06/12 Javascript
jQuery中复合选择器简单用法示例
2018/03/31 jQuery
JavaScript实现一个带AI的井字棋游戏源码
2018/05/21 Javascript
vue-cli webpack 引入swiper的操作方法
2018/09/15 Javascript
Node.js创建一个Express服务的方法详解
2020/01/06 Javascript
[42:20]2014 DOTA2华西杯精英邀请赛5 24 DK VS NewBee
2014/05/25 DOTA
[01:30:54]《加油DOTA》 第三期
2014/08/18 DOTA
python执行子进程实现进程间通信的方法
2015/06/02 Python
python OpenCV学习笔记之绘制直方图的方法
2018/02/08 Python
python将.ppm格式图片转换成.jpg格式文件的方法
2018/10/27 Python
python实现统计文本中单词出现的频率详解
2019/05/20 Python
Python 列表去重去除空字符的例子
2019/07/20 Python
python基于TCP实现的文件下载器功能案例
2019/12/10 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
2020/02/05 Python
Django 实现将图片转为Base64,然后使用json传输
2020/03/27 Python
python urllib和urllib3知识点总结
2021/02/08 Python
HTML5中实现拖放效果无须借助javascript
2012/12/26 HTML / CSS
Myprotein瑞士官方网站:运动营养和健身网上商店
2019/09/25 全球购物
护士自荐信范文
2013/12/15 职场文书
2015年个人现实表现材料
2014/12/10 职场文书
2015年见习期个人工作总结
2015/05/28 职场文书
人民的好儿女观后感
2015/06/18 职场文书
小学毕业感言100字
2015/07/30 职场文书
MySQL系列之九 mysql查询缓存及索引
2021/07/02 MySQL
Java spring单点登录系统
2021/09/04 Java/Android