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中怎么做对象的类型判断
Nov 11 Javascript
ANGULARJS中用NG-BIND指令实现单向绑定的例子
Dec 08 Javascript
transport.js和jquery冲突问题的解决方法
Feb 10 Javascript
jquery中EasyUI实现异步树
Mar 01 Javascript
javascript+css3 实现动态按钮菜单特效
Feb 06 Javascript
js通过classname来获取元素的方法
Nov 24 Javascript
javascript事件的传播基础实例讲解(35)
Feb 14 Javascript
canvas实现爱心和彩虹雨效果
Mar 09 Javascript
javascript基本数据类型和转换
Mar 17 Javascript
微信小程序url与token设置详解
Sep 26 Javascript
解决VUEX兼容IE上的报错问题
Mar 01 Javascript
浅谈Vue.use到底是什么鬼
Jan 21 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
通过ODBC连接的SQL SERVER实例
2006/10/09 PHP
从一个不错的留言本弄的mysql数据库操作类
2007/09/02 PHP
PHP 5.0对象模型深度探索之对象复制
2008/03/27 PHP
php下清空字符串中的HTML标签的代码
2010/09/06 PHP
php实现文件下载简单示例(代码实现文件下载)
2014/03/10 PHP
PHP创建XML接口示例
2019/07/04 PHP
IE6/7/8中Option元素未设value时Select将获取空字符串
2011/04/07 Javascript
javascript获取设置div的高度和宽度兼容任何浏览器
2013/09/22 Javascript
jQuery中replaceWith()方法用法实例
2014/12/25 Javascript
纯javascript实现分页(两种方法)
2015/08/26 Javascript
JavaScript获取服务器端时间的方法
2016/11/29 Javascript
JavaScript获取短信验证码(周期性)
2016/12/29 Javascript
javascript实现下雨效果
2017/03/27 Javascript
在react-router4中进行代码拆分的方法(基于webpack)
2018/03/08 Javascript
Node.js使用supervisor进行开发中调试的方法
2019/03/26 Javascript
vue项目中极验验证的使用代码示例
2019/12/03 Javascript
Vue 3.0 全家桶抢先体验
2020/04/28 Javascript
vue用elementui写form表单时,在label里添加空格操作
2020/08/13 Javascript
[01:06:42]VP vs NewBee Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
python 限制函数执行时间,自己实现timeout的实例
2019/01/12 Python
Python利用itchat库向好友或者公众号发消息的实例
2019/02/21 Python
python实现高斯投影正反算方式
2020/01/17 Python
PyCharm MySQL可视化Database配置过程图解
2020/06/09 Python
通俗讲解python 装饰器
2020/09/07 Python
windows+vscode安装paddleOCR运行环境的步骤
2020/11/11 Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
2020/12/21 Python
德国在线订购鲜花:Fleurop
2018/08/25 全球购物
TOWER London官网:鞋子、靴子、运动鞋等
2019/07/14 全球购物
党员承诺书格式
2014/05/21 职场文书
应用外语系自荐信
2014/06/26 职场文书
甜品店创业计划书
2014/08/14 职场文书
2014年十一国庆节活动方案
2014/09/16 职场文书
文明单位创建材料
2014/12/24 职场文书
2016春节家属慰问信
2015/03/25 职场文书
晚会开幕词范文
2016/03/04 职场文书
pytorch 预训练模型读取修改相关参数的填坑问题
2021/06/05 Python