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 UI 1.72 之datepicker
Dec 29 Javascript
JavaScript判断一个URL链接是否有效的实现方法
Oct 08 Javascript
求数组最大最小值方法适用于任何数组
Aug 16 Javascript
jQuery中操控hidden、disable等无值属性的方法
Jan 06 Javascript
js给页面加style无效果的解决方法
Jan 20 Javascript
JavaScript实现搜索框的自动完成功能(一)
Feb 25 Javascript
jQuery实现checkbox列表的全选、反选功能
Nov 24 Javascript
React-Native中props具体使用详解
Sep 04 Javascript
利用VS Code开发你的第一个AngularJS 2应用程序
Dec 15 Javascript
node.js使用redis储存session的方法
Sep 26 Javascript
vue中进行微博分享的实例讲解
Oct 14 Javascript
html中两种获取标签内的值的方法
Jun 16 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
php合并数组array_merge函数运算符加号与的区别
2008/10/31 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
2015/09/14 PHP
PHP实现操作redis的封装类完整实例
2015/11/14 PHP
Yii快速入门经典教程
2015/12/28 PHP
php实现有序数组旋转后寻找最小值方法
2018/09/27 PHP
web 页面分页打印的实现
2009/06/22 Javascript
JavaScript 对象成员的可见性说明
2009/10/16 Javascript
js查错流程归纳
2012/05/04 Javascript
基于jquery实现放大镜效果
2015/08/17 Javascript
JavaScript类型系统之Object详解
2016/01/07 Javascript
bootstrap和jQuery.Gantt的css冲突 如何解决
2016/05/29 Javascript
JavaScript判断日期时间差的实例代码
2018/03/01 Javascript
讲解vue-router之什么是动态路由
2018/05/28 Javascript
详解操作虚拟dom模拟react视图渲染
2018/07/25 Javascript
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
npm 语义版本控制详解
2019/09/10 Javascript
netbeans7安装python插件的方法图解
2013/12/24 Python
快速入手Python字符编码
2016/08/03 Python
Django数据库连接丢失问题的解决方法
2018/12/29 Python
Python中栈、队列与优先级队列的实现方法
2019/06/30 Python
python实现对图片进行旋转,放缩,裁剪的功能
2019/08/07 Python
Python pytesseract验证码识别库用法解析
2020/06/29 Python
阿迪达斯印度官方商城:adidas India
2017/03/26 全球购物
“型”走纽约上东区:Sam Edelman
2017/04/02 全球购物
Hush Puppies澳大利亚官网:舒适的男女休闲和正装鞋
2019/08/24 全球购物
俄罗斯设计师家具购物网站:The Furnish
2019/12/01 全球购物
大学教师年终总结的自我评价
2013/10/29 职场文书
社区学习十八大感想
2014/01/22 职场文书
互联网创业计划书写作技巧攻略
2014/03/23 职场文书
教师作风整改措施思想汇报
2014/10/12 职场文书
政协工作总结2015
2015/05/20 职场文书
考研经验交流会策划书
2015/11/02 职场文书
党员干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
教你用Python爬取英雄联盟皮肤原画
2021/06/13 Python
mongodb数据库迁移变更的解决方案
2021/09/04 MongoDB
keepalived + nginx 实现高可用方案
2022/12/24 Servers