全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

javascript常用的设计模式

js最好是一种面向对象的语言。它的出现时比较迟的。但是它是目前最火的脚本语言。而且,随着近期的微信商城等页面的兴起,相信程序员和互联网的从业者都知道了js正在势头上了。

那么,如果你想要在前端这条路上走得更远,设计模式就必须要懂。下面介绍几种常见的设计模式。

一、单例模式

单例模式也称作为单子模式,更多的也叫做单体模式。为软件设计中较为简单但是最为常用的一种设计模式。 在JavaScript里,实现单例的方式有很多种,其中最简单的一个方式是使用对象字面量的方法,其字面量里可以包含大量的属性和方法:

var mySingleton = {
property1: "something",
property2: "something else",
method1: function () {
  console.log('hello world');
}};

如果以后要扩展该对象,你可以添加自己的私有成员和方法,然后使用闭包在其内部封装这些变量和函数声明。只暴露你想暴露的public成员和方法,样例代码如下:

 var mySingleton = function () {
  /* 这里声明私有变量和方法 */
  var privateVariable = 'something private';
  function showPrivate() {
    console.log(privateVariable);
  }
  /* 公有变量和方法(可以访问私有变量和方法) */
  return {
    publicMethod: function () {
      showPrivate();
    },
    publicVar: 'the public can see this!'
  };
};
var single = mySingleton();
single.publicMethod(); // 输出 'something private'
console.log(single.publicVar); // 输出 'the public can see this!'

上面的代码很不错了,但如果我们想做到只有在使用的时候才初始化,那该如何做呢?为了节约资源的目的,我们可以另外一个构造函数里来初始化这些代码,如下:

var Singleton = (function () {
  var instantiated;
  function init() {
    /*这里定义单例代码*/
    return {
      publicMethod: function () {
        console.log('hello world');
      },
      publicProperty: 'test'
    };
  }
  return {
    getInstance: function () {
      if (!instantiated) {
        instantiated = init();
      }
      return instantiated;
    }
  };
})();
/*调用公有的方法来获取实例:*/
Singleton.getInstance().publicMethod();

二、工厂模式

工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况。 说的通俗点,就像公司茶水间的饮料机,要咖啡还是牛奶取决于你按哪个按钮。

实例:

function A( name ){
       this.name = name;
    }
    function ObjectFactory(){
       var obj = {},
           Constructor = Array.prototype.shift.call( arguments );
obj.__proto__ = typeof Constructor .prototype === 'number' ? Object.prototype
: Constructor .prototype;
       var ret = Constructor.apply( obj, arguments );
       return typeof ret === 'object' ? ret : obj;
    }
    var a = ObjectFactory( A, 'svenzeng' );
    alert ( a.name ); //svenzeng

这段代码来自es5的new和构造器的相关说明, 可以看到,所谓的new, 本身只是一个对象的复制和改写过程, 而具体会生成什么是由调用ObjectFactory时传进去的参数所决定的。

三、 适配模式

简单的说,适配模式主要是为了解决一些接口不兼容产生的解决方法。借助于适配器我们可以在不修改这些不兼容接口的情况下给使用者提供统一的包装过的适配接口。表面上又感觉和之前的门面模式比较像,均是对其他对象或者接口进行包装再呈现,而适配器模式偏向的是解决兼容性问题,门面模式则偏向方便性为原则。

比如一个简单的学生查询学科成绩的方法:

  function selectScore( name, id, course_id ){
  // arguments 姓名 学号 课程id
  ...
}

当我需要一个班级某门学科的整体成绩列表,而我手上只有每个学生如下的数据

[
  { name: 'lily', studentID: '0911' },
  { name: 'suny', studentID: '0912' },
  ...
]

我需要查询 英语 其课程ID为 101,那么对于该任务,写一个适配器方式是很恰当不过的

function selectEnglishScore( stutentObj ){
  selectScore( stutentObj.name, stutentObj.studentID , 101);
}

这是一个最简单的关于适配器来处理参数方面兼容的形式。 其实简单的来说,适配器模式意义上很简单 - 适配,解决兼容问题。

例子二,比如你觉得jquery里边的$选择器需要改成$id才能和你的项目搭配,那么这时候写一个方法,将$转换成$id就很轻松了。如下:

$id = function( id ){
 return jQuery( '#' + id )[0];
}

四、外观模式

外观模式(门面模式),是一种相对简单而又无处不在的模式。外观模式提供一个高层接口,这个接口使得客户端或子系统更加方便调用。 用一段再简单不过的代码来表示:

var getName = function(){
 return ''svenzeng"
}
var getSex = function(){
  return 'man'
}

如果你需要分别调用getName和getSex函数. 那可以用一个更高层的接口getUserInfo来调用.:

var getUserInfo = function(){
 var info = a() + b();
 return info;
}

也许你会问为什么一开始不把getName和getSex的代码写到一起, 比如这样:

var getNameAndSex = function(){
 return 'svenzeng" + "man";
}

答案是显而易见的,饭堂的炒菜师傅不会因为你预定了一份烧鸭和一份白菜就把这两样菜炒在一个锅里。他更愿意给你提供一个烧鸭饭套餐。同样在程序设计中,我们需要保证函数或者对象尽可能的处在一个合理粒度,毕竟不是每个人喜欢吃烧鸭的同时又刚好喜欢吃白菜。 外观模式还有一个好处是可以对用户隐藏真正的实现细节,用户只关心最高层的接口。比如在烧鸭饭套餐的故事中,你并不关心师傅是先做烧鸭还是先炒白菜,你也不关心那只鸭子是在哪里成长的。

最后写个我们都用过的外观模式例子:

var stopEvent = function( e ){  //同时阻止事件默认行为和冒泡
 e.stopPropagation();
 e.preventDefault();
}

好了,今天的额设计模式就先到这里。如果大家想要了解更多的设计模式可以去汤姆大叔的博客欣赏哦。还有,这里的很多的设计模式其实都是将解决问题的方法细化了的说法,如果去看一下prototype或者jquery都会知道,其实里边的代码很多都用到了设计模式的。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# js  # 设计模式  # JS设计模式之责任链模式实例详解  # JavaScript编程设计模式之构造器模式实例分析  # JS设计模式之数据访问对象模式的实例讲解  # JavaScript设计模式之代理模式详解  # JavaScript设计模式之单例模式详解  # JavaScript设计模式之策略模式详解  # JavaScript 设计模式 安全沙箱模式  # JavaScript设计模式之观察者模式(发布者-订阅者模式)  # javascript设计模式之解释器模式详解  # JavaScript设计模式之调停者模式实例详解  # 是在  # 是一种  # 是由  # 你想  # 我们可以  # 提供一个  # 最简单  # 方法来  # 喜欢吃  # 自己的  # 汤姆  # 不兼容  # 的是  # 都是  # 如果你  # 互联网  # 好了  # 给你  # 就像  # 你可以 


相关文章: 做企业网站制作流程,企业网站制作基本流程有哪些?  建站之星安装后界面空白如何解决?  如何获取上海专业网站定制建站电话?  如何在阿里云虚拟服务器快速搭建网站?  网站制作费用多少钱,一个网站的运营,需要哪些费用?  常州自助建站:操作简便模板丰富,企业个人快速搭建网站  营销式网站制作方案,销售哪个网站招聘效果最好?  如何在橙子建站上传落地页?操作指南详解  如何快速搭建FTP站点实现文件共享?  网站制作壁纸教程视频,电脑壁纸网站?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  制作销售网站教学视频,销售网站有哪些?  表情包在线制作网站免费,表情包怎么弄?  如何解决ASP生成WAP建站中文乱码问题?  如何快速搭建高效简练网站?  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  ,制作一个手机app网站要多少钱?  如何快速查询网址的建站时间与历史轨迹?  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  建站VPS选购需注意哪些关键参数?  如何快速搭建高效可靠的建站解决方案?  如何在云主机上快速搭建网站?  外汇网站制作流程,如何在工商银行网站上做外汇买卖?  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  如何在新浪SAE免费搭建个人博客?  如何快速搭建高效服务器建站系统?  如何快速搭建虚拟主机网站?新手必看指南  寿县云建站:智能SEO优化与多行业模板快速上线指南  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  个人网站制作流程图片大全,个人网站如何注销?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  如何在阿里云ECS服务器部署织梦CMS网站?  网站制作需要会哪些技术,建立一个网站要花费多少?  宿州网站制作公司兴策,安徽省低保查询网站?  建站主机选择指南:服务器配置与SEO优化实战技巧  威客平台建站流程解析:高效搭建教程与设计优化方案  h5网站制作工具有哪些,h5页面制作工具有哪些?  定制建站是什么?如何实现个性化需求?  如何通过FTP服务器快速搭建网站?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  如何选择域名并搭建高效网站?  微课制作网站有哪些,微课网怎么进?  如何构建满足综合性能需求的优质建站方案?  ,交易猫的商品怎么发布到网站上去?  高性价比服务器租赁——企业级配置与24小时运维服务 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。