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 当前日期加(天、周、月、年)
Aug 09 Javascript
一个简单的javascript类定义例子
Sep 12 Javascript
jquery的index方法实现tab效果
Feb 16 Javascript
JsDom 编程小结
Aug 09 Javascript
JQuery中使用Ajax赋值给全局变量异常的解决方法
Jan 10 Javascript
Bootstrap精简教程
Nov 27 Javascript
js 获取元素所有兄弟节点的实现方法
Sep 06 Javascript
微信小程序 switch组件详解及简单实例
Jan 10 Javascript
JS实现常见的查找、排序、去重算法示例
May 21 Javascript
vue路由教程之静态路由
Sep 03 Javascript
vue 使用外部JS与调用原生API操作示例
Dec 02 Javascript
vue 导航菜单刷新状态不消失,显示对应的路由界面操作
Aug 06 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实现定时生成HTML网站首页实例代码
2008/11/20 PHP
基于php设计模式中单例模式的应用分析
2013/05/15 PHP
PHP连接Access数据库的方法小结
2013/06/20 PHP
PHP curl模拟登录带验证码的网站
2015/11/30 PHP
PHP那些琐碎的知识点(整理)
2017/05/20 PHP
javascript预览上传图片发现的问题的解决方法
2010/11/25 Javascript
利用jquery写的左右轮播图特效
2014/02/12 Javascript
JavaScript获取页面中超链接数量的方法
2015/11/09 Javascript
Angular2安装angular-cli
2017/05/21 Javascript
javascript 开发之网页兼容各种浏览器
2017/09/28 Javascript
解决vue-cli3 使用子目录部署问题
2018/07/19 Javascript
微信小程序实现笑脸评分功能
2018/11/03 Javascript
使用vuex解决刷新页面state数据消失的问题记录
2019/05/08 Javascript
vue 解决数组赋值无法渲染在页面的问题
2019/10/28 Javascript
使用zrender.js绘制体温单效果
2019/10/31 Javascript
Vue实现点击按钮复制文本内容的例子
2019/11/09 Javascript
js实现多个标题吸顶效果
2020/01/08 Javascript
JS中锚点链接点击平滑滚动并自由调整到顶部位置
2021/02/06 Javascript
Python中的ConfigParser模块使用详解
2015/05/04 Python
python根据日期返回星期几的方法
2015/07/06 Python
Python中的urllib模块使用详解
2015/07/07 Python
pandas 小数位数 精度的处理方法
2018/06/09 Python
对numpy数据写入文件的方法讲解
2018/07/09 Python
Python 数值区间处理_对interval 库的快速入门详解
2018/11/16 Python
python处理excel绘制雷达图
2019/10/18 Python
Python 读取WAV音频文件 画频谱的实例
2020/03/14 Python
什么是python的函数体
2020/06/19 Python
python中yield的用法详解
2021/01/13 Python
香港唯港荟酒店预订:Hotel ICON
2018/03/27 全球购物
C和C++经典笔试题附答案解析
2014/08/18 面试题
会计电算化专业毕业生自荐信
2013/12/20 职场文书
光荣入党自我鉴定
2014/01/22 职场文书
公开服务承诺制度
2014/03/26 职场文书
班主任班级寄语大全
2014/04/04 职场文书
2014-2015学年工作总结
2014/11/27 职场文书
刑事辩护词范文
2015/05/21 职场文书