es6有工厂模式吗

es6有工厂模式;工厂模式将逻辑封装到一个函数中,在es6中可以不使用构造函数创建对象,而使用class配合static关键字将简单工厂封装到User类的静态方法中,语法为“class User{构造器}static 静态方法(){}”。

es6有工厂模式吗

本教程操作环境:windows10系统、ECMAScript 6.0版、Dell G3电脑。

es6有工厂模式吗

ES6中给我们提供了class新语法,虽然class本质上是一颗语法糖,并也没有改变JavaScript是使用原型继承的语言,但是确实让对象的创建和继承的过程变得更加的清晰和易读。下面我们使用ES6的新语法来重写上面的例子。

ES6重写简单工厂模式

使用ES6重写简单工厂模式时,我们不再使用构造函数创建对象,而是使用class的新语法,并使用static关键字将简单工厂封装到User类的静态方法中:

//User类class User {  //构造器  constructor(opt) {    this.name = opt.name;    this.viewPage = opt.viewPage;  }  //静态方法  static getInstance(role) {    switch (role) {      case 'superAdmin':      return new User({ name: '超级管理员', viewPage: ['首页', '通讯录', '发现页', '应用数据', '权限管理'] });        break;      case 'admin':        return new User({ name: '管理员', viewPage: ['首页', '通讯录', '发现页', '应用数据'] });        break;      case 'user':        return new User({ name: '普通用户', viewPage: ['首页', '通讯录', '发现页'] });        break;      default:        throw new Error('参数错误, 可选参数:superAdmin、admin、user')    }  }}//调用let superAdmin = User.getInstance('superAdmin');let admin = User.getInstance('admin');let normalUser = User.getInstance('user');

登录后复制

工厂模式是最常见的一种开发模式,将new操作单独封装,当遇到new是应考虑工厂模式。创建对象,不暴露代码逻辑,把逻辑写到函数里面。这个函数就是工厂模式。优点,简单。   缺点就是,每增加构造函数,都要修改函数里面的代码逻辑。

工厂模式是用来创建对象的一种最常用的设计模式。我们不暴露创建对象的具体逻辑,而是将将逻辑封装在一个函数中,那么这个函数就可以被视为一个工厂。工厂模式根据抽象程度的不同可以分为:简单工厂,工厂方法和抽象工厂。

如果只接触过JavaScript这门语言的的人可能会对抽象这个词的概念有点模糊,因为JavaScript一直将abstract作为保留字而没有去实现它。如果不能很好的理解抽象的概念,那么就很难理解工厂模式中的三种方法的异同。所以,我们先以一个场景去简单的讲述一下抽象和工厂的概念。

简单工厂模式又叫静态工厂模式,由一个工厂对象决定创建某一种产品对象类的实例。主要用来创建同一类对象。

在实际的项目中,我们常常需要根据用户的权限来渲染不同的页面,高级权限的用户所拥有的页面有些是无法被低级权限的用户所查看。所以我们可以在不同权限等级用户的构造函数中,保存该用户能够看到的页面。在根据权限实例化用户。

代码如下:

class SuperAdmin{  constructor(){    this.name = "超级管理员";    this.viewPage = ['首页', '通讯录', '发现页', '应用数据', '权限管理'];  }}class Admin{  constructor(){    this.name = "管理员";    this.viewPage = ['首页', '通讯录', '发现页', '应用数据', '权限管理'];  }}class NormalUser{  constructor(){    this.name = "普通用户";    this.viewPage = ['首页', '通讯录', '发现页', '应用数据', '权限管理'];  }}//工厂方法类class UserFactory {  getFactory(role){   switch (role) {     case 'superAdmin':       return new SuperAdmin();       break;     case 'admin':       return new Admin();       break;     case 'user':       return new NormalUser();       break;     default:       throw new Error('参数错误, 可选参数:superAdmin、admin、user');   }  } } //调用let uesr =new UserFactory();uesr.getFactory('superAdmin');uesr.getFactory('admin');uesr.getFactory('user');

登录后复制

简单工厂的优点在于,你只需要一个正确的参数,就可以获取到你所需要的对象,而无需知道其创建的具体细节。但是在函数内包含了所有对象的创建逻辑(构造函数)和判断逻辑的代码,每增加新的构造函数还需要修改判断逻辑代码。

当我们的对象不是上面的3个而是30个或更多时,这个函数会成为一个庞大的超级函数,便得难以维护。

所以,简单工厂只能作用于 创建的对象数量较少,对象的创建逻辑不复杂时使用。

【相关推荐:javascript视频教程、web前端】

以上就是es6有工厂模式吗的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2931485.html

(0)
上一篇 2025年3月11日 20:10:13
下一篇 2025年3月3日 19:15:45

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • idea可以运行es6吗

    idea可以运行es6。设置方法:1、点击“File-settings”,进入设置界面;2、点击“Languages&Frameworks”,选择JavaScript language version内容为“ECMAScript6+…

    2025年3月11日
    200
  • es6中let声明可以重名吗

    在es6中,let声明的变量不可以重名,因为let不允许在相同的作用域内重复声明同一个变量,否则会出现报错;因此可以利用let防止变量命名的重复,以及防止变量污染;与let相反的是var,var允许变量重复声明。 本教程操作环境:windo…

    2025年3月11日
    200
  • es6的map对象和原生对象有啥区别

    区别:1、原生object对象存储键值对组合中键的类型是字符串,map对象存储键值对的类型可以是任意类型;2、原生object对象获取键值使用的是“Object.keys”,返回的是数组,而map对象采用的是“map变量.keys()”。 …

    2025年3月11日
    200
  • es6中await和async有什么作用

    es6中await和async的作用分别是:1、async用于声明一个函数是异步执行,并返回一个Promise对象;2、await用于等待一个异步方法执行完成,因为await只能用于async函数中,所以用于等待一个async函数的返回值。…

    2025年3月11日
    200
  • es6中const的用法是什么

    在es6中,const用于声明一个只读的常量,语法为“const 常量名= 常量值;”;常量一旦声明,常量的值就不能改变,并且只在声明所在的块级作用域内有效,const命令声明的常量也是不提升,只能在声明的位置后面使用。 本教程操作环境:w…

    2025年3月11日
    200
  • es6遍历对象的方法是什么

    方法:1、用“Object.keys(obj)”遍历对象,返回一个包括对象自身所有可枚举属性的键名数组;2、用“Reflect.ownKeys(obj)”遍历对象,返回一个包含对象自身的所有键名的数组;3、用“for in”循环遍历对象等。…

    2025年3月11日
    200
  • es6中fetch的用法是什么

    es6中,fetch用于发起远程资源的请求,是提供跨网络异步获取资源的方法;该方法被定义在BOM的window对象中,返回一个Promise对象,语法“fetch(url,配置对象).then(function(response){})”。…

    2025年3月11日
    200
  • es6怎么删除子串

    删除子串的两种方法:1、使用replace()去除字符串中第一次出现的子串,语法“字符串对象.replace(“子串值”,””)”;2、使用replaceAll()去除全部子串,语法“字符串对…

    2025年3月11日 编程技术
    200
  • es6遍历对象的方法有哪些

    遍历对象的6种方法:1、“for…in”语句,可循环遍历对象自身的和继承的可枚举属性;2、keys()对属性名进行遍历,values()对属性值进行遍历;3、getOwnPropertyNames(),可返回一个包含所有属性的数…

    2025年3月11日 编程技术
    200
  • es6解构赋值有什么作用

    作用:1、交换两变量的值,语法“[x,y] = [y,x];”;2、分解字符串,将字符传入变量,语法“[变量列表]=字符串”;3、从函数中返回多个值,语法“[变量列表]=函数”;4、提取json数据,语法“{变量列表}=json变量”等等。…

    2025年3月11日
    200

发表回复

登录后才能评论