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 相关文章推荐
SwfUpload在IE10上不出现上传按钮的解决方法
Jun 25 Javascript
js获取上传文件大小示例代码
Apr 10 Javascript
Javascript单例模式的介绍和实例
Oct 08 Javascript
js数组操作方法总结(必看篇)
Nov 22 Javascript
JavaScript requestAnimationFrame动画详解
Sep 14 Javascript
vue router 源码概览案例分析
Oct 09 Javascript
在小程序开发中使用npm的方法
Oct 17 Javascript
Vue.js中 v-model 指令的修饰符详解
Dec 03 Javascript
详解Vue路由自动注入实践
Apr 17 Javascript
vue  elementUI 表单嵌套验证的实例代码
Nov 06 Javascript
JS字符串补全方法padStart()和padEnd()
May 27 Javascript
从原生JavaScript到React深入理解
Jul 23 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
一个简单的自动发送邮件系统(三)
2006/10/09 PHP
phpMyAdmin 链接表的附加功能尚未激活的问题
2010/08/01 PHP
PHP使用PHPMailer发送邮件的简单使用方法
2013/11/12 PHP
PHP中实现Bloom Filter算法
2015/03/30 PHP
PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享
2016/05/06 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
2016/11/05 PHP
PHP使用SMTP邮件服务器发送邮件示例
2018/08/28 PHP
php对mongodb的扩展(小试牛刀)
2012/11/11 Javascript
JS图像无缝滚动脚本非常好用
2014/02/10 Javascript
JavaScript实现快速排序的方法
2015/07/31 Javascript
TypeOf这些知识点你了解吗
2016/02/21 Javascript
js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码
2016/04/30 Javascript
Markdown与Bootstrap相结合实现图片自适应属性
2016/05/04 Javascript
基于BootStrap Metronic开发框架经验小结【四】Bootstrap图标的提取和利用
2016/05/12 Javascript
通过BootStrap实现轮播图的实际应用
2016/09/26 Javascript
Cropper.js 实现裁剪图片并上传(PC端)
2017/08/20 Javascript
快速了解Node中的Stream流是什么
2019/02/13 Javascript
layui 实现加载动画以及非真实加载进度的方法
2019/09/23 Javascript
vue 获取及修改store.js里的公共变量实例
2019/11/06 Javascript
[36:52]DOTA2真视界:基辅特锦赛总决赛
2017/05/21 DOTA
python读取注册表中值的方法
2013/04/08 Python
Python的Bottle框架的一些使用技巧介绍
2015/04/08 Python
bpython 功能强大的Python shell
2016/02/16 Python
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
2017/12/14 Python
python爬取基于m3u8协议的ts文件并合并
2019/04/26 Python
Python中的单下划线和双下划线使用场景详解
2019/09/09 Python
windows中安装Python3.8.0的实现方法
2019/11/19 Python
Numpy一维线性插值函数的用法
2020/04/22 Python
Python实现Excel自动分组合并单元格
2021/02/22 Python
突袭HTML5之Javascript API扩展4—拖拽(Drag/Drop)概述
2013/01/31 HTML / CSS
找到您丢失的钥匙、钱包和手机:Tile
2017/05/19 全球购物
Onzie官网:美国时尚瑜伽品牌
2019/08/21 全球购物
中专生的个人自我评价
2013/12/11 职场文书
农民致富事迹材料
2014/01/23 职场文书
公司会计岗位职责
2014/02/13 职场文书
Python中glob库实现文件名的匹配
2021/06/18 Python