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 相关文章推荐
文本框中,回车键触发事件的js代码[多浏览器兼容]
Jun 07 Javascript
js 限制input只能输入数字、字母和汉字等等
Dec 18 Javascript
如何屏蔽防止别的网站嵌入框架代码
Aug 24 Javascript
JavaScript实现的MD5算法完整实例
Feb 02 Javascript
使用pcs api往免费的百度网盘上传下载文件的方法
Mar 17 Javascript
jQuery遍历json的方法分析
Apr 16 Javascript
使用JQuery 加载页面时调用JS的实现方法
May 30 Javascript
vue组件中使用iframe元素的示例代码
Dec 13 Javascript
vue实现word,pdf文件的导出功能
Jul 31 Javascript
基于Vue的侧边目录组件的实现
Feb 05 Javascript
vue实现匀速轮播效果
Jun 29 Javascript
vue3使用vuedraggable实现拖拽功能
Apr 06 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
合作指挥官:孟斯克
2020/03/16 星际争霸
怎么样可以把 phpinfo()屏蔽掉?
2006/11/24 PHP
php中10个不同等级压缩优化图片操作示例
2016/11/14 PHP
javascript向flash swf文件传递参数值注意细节
2012/12/11 Javascript
常用jQuery选择器总结
2014/07/11 Javascript
项目中常用的JS方法整理
2015/01/30 Javascript
JavaScript获取表单内所有元素值的方法
2015/04/02 Javascript
jquery分页插件jquery.pagination.js使用方法解析
2016/04/01 Javascript
JS识别浏览器类型(电脑浏览器和手机浏览器)
2016/11/18 Javascript
express默认日志组件morgan的方法
2018/04/05 Javascript
浅析JS中什么是自定义react数据验证组件
2018/10/19 Javascript
vue滚动插件better-scroll使用详解
2019/10/18 Javascript
vue项目实现设置根据路由高亮对应的菜单项操作
2020/08/06 Javascript
AngularJs的$http发送POST请求,php无法接收Post的数据问题及解决方案
2020/08/13 Javascript
[05:31]干嘛呢兄弟!DOTA2 TI9语音轮盘部分出处
2019/05/14 DOTA
python备份文件以及mysql数据库的脚本代码
2013/06/10 Python
python快速排序代码实例
2013/11/21 Python
Python实现的简单万年历例子分享
2014/04/25 Python
Python中使用Tkinter模块创建GUI程序实例
2015/01/14 Python
python数据预处理之将类别数据转换为数值的方法
2017/07/05 Python
使用apidoc管理RESTful风格Flask项目接口文档方法
2018/02/07 Python
深入理解Python 关于supper 的 用法和原理
2018/02/28 Python
在Python中增加和插入元素的示例
2018/11/01 Python
Python函数的参数常见分类与用法实例详解
2019/03/30 Python
Python爬虫——爬取豆瓣电影Top250代码实例
2019/04/17 Python
python语言基本语句用法总结
2019/06/11 Python
Python流程控制常用工具详解
2020/02/24 Python
Python爬虫实现vip电影下载的示例代码
2020/04/20 Python
python 浮点数四舍五入需要注意的地方
2020/08/18 Python
wedgwood加拿大官网:1759年成立的英国国宝级陶瓷餐具品牌
2018/07/17 全球购物
介绍一下#error预处理
2015/09/25 面试题
生产内勤岗位职责
2013/12/07 职场文书
小饰品店的创业计划书范文
2013/12/28 职场文书
2014年创卫工作总结
2014/11/24 职场文书
春节慰问信范文
2015/02/15 职场文书
酒吧七夕情人节宣传语
2015/11/24 职场文书