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 相关文章推荐
Node.js入门教程:在windows和Linux上安装配置Node.js图文教程
Aug 14 Javascript
node.js中的querystring.unescape方法使用说明
Dec 10 Javascript
ECMAScript6快速入手攻略
Jul 18 Javascript
Javascript+CSS3实现进度条效果
Oct 28 Javascript
AngularJs入门教程之环境搭建+创建应用示例
Nov 01 Javascript
vue实现导航栏效果(选中状态刷新不消失)
Dec 13 Javascript
js阻止默认右键的下拉菜单方法
Jan 02 Javascript
微信小程序实现倒计时调用相机自动拍照功能
Jun 10 Javascript
详解swipe使用及竖屏页面滚动方法
Jun 28 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
Jan 18 Javascript
Vue组件模板的几种书写形式(3种)
Feb 19 Javascript
使用原生JS实现滚轮翻页效果的示例代码
May 31 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
玛琪朵 Macchiato
2021/03/03 咖啡文化
数据库的日期格式转换
2006/10/09 PHP
网页游戏开发入门教程二(游戏模式+系统)
2009/11/02 PHP
PHP中函数rand和mt_rand的区别比较
2012/12/26 PHP
ThinkPHP字符串函数及常用函数汇总
2014/07/18 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
PHP attributes()函数讲解
2019/02/03 PHP
增强用户体验友好性之jquery easyui window 窗口关闭时的提示
2012/06/22 Javascript
javaScript年份下拉列表框内容为当前年份及前后50年
2014/05/28 Javascript
JavaScript使用setTimeout实现延迟弹出警告框的方法
2015/04/07 Javascript
JavaScript正则表达式中的ignoreCase属性使用详解
2015/06/16 Javascript
JavaScript计算值然后把值嵌入到html中的实现方法
2016/10/29 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
JS实现滑动门效果的方法详解
2016/12/19 Javascript
基于Marquee.js插件实现的跑马灯效果示例
2017/01/25 Javascript
浅谈jquery拼接字符串效率比较高的方法
2017/02/22 Javascript
React Native中TabBarIOS的简单使用方法示例
2017/10/13 Javascript
解决微信小程序防止无法回到主页的问题
2018/09/28 Javascript
checkbox在vue中的用法小结
2018/11/13 Javascript
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
2018/12/06 NodeJs
JavaScript实现邮箱后缀提示功能的示例代码
2018/12/13 Javascript
layer ui插件显示tips时,修改字体颜色的实现方法
2019/09/11 Javascript
jQuery鼠标滑过横向时间轴样式(代码详解)
2019/11/01 jQuery
python pandas消除空值和空格以及 Nan数据替换方法
2018/10/30 Python
python 列表输出重复值以及对应的角标方法
2019/06/11 Python
elasticsearch python 查询的两种方法
2019/08/04 Python
python多线程同步之文件读写控制
2021/02/25 Python
关于多元线性回归分析——Python&SPSS
2020/02/24 Python
TensorFlow低版本代码自动升级为1.0版本
2021/02/20 Python
CSS3利用text-shadow属性实现多种效果的文字样式展现方法
2016/08/25 HTML / CSS
Falconeri美国官网:由羊绒和羊毛制成的针织服装
2018/04/08 全球购物
网上快餐厅创业计划书
2014/02/01 职场文书
员工薪酬激励方案
2014/06/13 职场文书
世界地球日活动总结
2015/02/09 职场文书
2016年五四青年节校园广播稿
2015/12/17 职场文书
预备党员的思想汇报,你真的会写吗?
2019/06/28 职场文书