您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > javascript

JavaScript设计模式——创建型设计模式

时间:2023-11-03 14:22:22  来源:微信公众号  作者:量子前端

简单工厂模式

抽象各个对象的共同点,加工出最初形态,对于不同点进行独立设计

function createBook(name, time, type) {
  //创建一个对象,并对对象拓展属性和方法
  const o = new Object();
  //共同参数
  o.name = name;
  o.time = time;
  o.getName = function () {
    console.log(this.name);
  }
  //差异性
  if (type === "js") {
    //js类书差异处理
  } else if (type === "css") {
    //css类书差异处理
  } else if (type === "html") {
    //html类书差异处理
  }
  return o;
}

const book1 = createBook('js book', 2014, 'js');
const book2 = createBook('css book', 2013, 'css');
const book3 = createBook('html book', 2012, 'css');

book1.getName();
book2.getName();
book3.getName();

安全工厂模式

安全工厂模式可以屏蔽对类的错误使用,如忘记写new实例化对象避免产生一些非预期的行为。

function Factory(type, content) {
  //如果忘记写new实例化了,加工重新执行一次
  if (this instanceof Factory) {
    this[type](content);
  } else {
    new Factory(type, content);
  }
}
Factory.prototype = {
  JAVAScript: (content) => {
    console.log(content)
  },
  Java: (content) => {
    console.log(content)
  },
}

Factory('JavaScript', 'JavaScript哪家强');
Factory('Java', 'Java哪家强');

建设者模式

顾名思义,结合多个类,创造出结合出来的终极人物(对象)

//创建人类
function Human(param) {
  //技能
  this.skill = param && param.skill || "保密";
  //兴趣爱好
  this.hobby = param && param.hobby || "保密";
}
Human.prototype.getSkill = function () {
  return this.skill;
}
Human.prototype.getHobby = function () {
  return this.hobby;
}
//创建姓名类
function Name(name) {
  (function (_this, name) {
    _this.wholeName = name;
    _this.firstName = name.slice(0, name.indexOf(" "));
    _this.secordName = name.slice(name.indexOf(" "));
  })(this, name)
}
//创建职位类
function Work(work) {
  (function (_this, work) {
    switch (work) {
      case "code":
        _this.work = "工程师";
        _this.workDescript = "每天沉醉于编程";
        break;
      case "UI":
      case "UE":
        _this.work = "设计师";
        _this.workDescript = "设计更是一种艺术";
        break;
      case "teach":
        _this.work = "教师";
        _this.workDescript = "分享页是一种快乐";
        break;
      default:
        _this.work = work;
        _this.workDescript = "对不起,我们还不清楚您所选择职位的相关描述";
    }
  })(this, work)
}
//创建建设者类
function Person(name, work) {
  var person = new Human();
  person.name = new Name(name);
  person.work = new Work(work);
  return person;
}

const person = new Person("xiao ming", "code");
console.log(person.skill);                  //保密
console.log(person.work.workDescript);      //每天沉醉于编程
console.log(person.name.firstName);         //xiao

这里结合了Humer、Name、Work,最后在Person中构造出了一个应聘者。

原型模式

用原型实例指向创建对象的类,适用于创建新的对象的类共享原型对象的属性以及方法。 简而言之,就是根据一个基类(原型类)构造出多个子类,将公用方法和属性保存在原型类中。

//图片轮播基类
function LoopImages(imgArr, contAIner) {
  this.imgArr = imgArr;
  this.container = container;
}
LoopImages.prototype = {
  //创建轮播图片
  createImage: function (img) {
    this.imgArr.push(img);
    console.log('LoopImages createImage function');
  },
  //切换下一张图片
  changeImage: () => {
    console.log('LoopImages changeImage function');
  }
}
//上下滑动切换类
function SlideLoopImg(imgArr, container) {
  LoopImages.call(this, imgArr, container);
}
SlideLoopImg.prototype = new LoopImages();
//重写继承的切换下一张图片方法
SlideLoopImg.prototype.changeImage = () => {
  console.log('SlideLoopImg changeImage function');
}

//渐隐切换类
function FadeLoopImg(imgArr, container, arrow) {
  LoopImages.call(this, imgArr, container);
  this.arrow = arrow;
}
FadeLoopImg.prototype = new LoopImages();
//重写继承的切换下一张图片方法
FadeLoopImg.prototype.changeImage = () => {
  console.log('FadeLoopImg changeImage function');
}

const fade = new FadeLoopImg([
  '01.jpg',
  '02.jpg',
  '03.jpg',
  '04.jpg'
], 'div', [
  'left.jpg',
  'right.jpg'
])
console.log(fade.arrow);        //['left.jpg','right.jpg']
console.log(fade.imgArr);       //['01.jpg', '02.jpg', '03.jpg', '04.jpg']
fade.createImage('05.jpg');     //LoopImages createImage function
console.log(fade.imgArr);        //['01.jpg', '02.jpg', '03.jpg', '04.jpg', '05.jpg']
fade.changeImage();             //FadeLoopImg changeImage function

可以看到,原型模式可以让多个对象分享同一个原型对象的属性与方法,这也是一种继承方式。 原型对象更加适合在创建复杂的对象时,对于那些需求一直在变化而导致对象结构不停改变时,将那些比较稳定的属性与方法公共提取,实现继承,代码复用。

单例模式

单例模式,顾名思义,一个类只能有一个实例,重复实例化只会返回第一次实例的对象。

静态变量

通过一个立即执行函数,将所有方法挂载,并且为静态变量,无法改变。

const React = (function () {
  var react = {
    useState: () => { },
    useEffect: () => { },
    useRef: () => { },
    useMemo: () => { },
    useCallback: () => { },
    useReducer: () => { },
    useContext: () => { }
  }
  return {
    get: function (name) {
      return react[name] || null;
    }
  }
})()

console.log(React.get('useState'))

实例化单例

创建一个立即执行函数,利用闭包,使记录值常驻在内存中,每次实例化的时候判断是否为第一次实例化,实现单例。

const React = (function () {
  let instance = null;
  return function (params) {
    if (instance) {
      return instance
    }
    this.params = params;
    return instance = this;
  }
})()

console.log(new React({
  useState: () => { },
  useEffect: () => { },
  useRef: () => { },
  useMemo: () => { },
  useCallback: () => { },
  useReducer: () => { },
  useContext: () => { }
}) === new React('hh'));      //true

惰性单例

非实例化创建方式,也是一种延迟创建的方式。

function React(fns) {
  this.fns = fns;
}
React.instance = null;
React.getFn = function () {
  console.log(this.fns)
}
React.getInstance = function (name) {
  if (!this.instance) {
    return this.instance = new React(name)
  }
  return this.instance
}

console.log(React.getInstance({
  useState: () => { },
  useEffect: () => { },
  useRef: () => { },
  useMemo: () => { },
  useCallback: () => { },
  useReducer: () => { },
  useContext: () => { }
}) === React.getInstance('xx'));    //true

总结

本文介绍了JavaScript中创建型设计模式,希望看过之后对读者开发中代码质量有所帮助,有所感悟。



Tags:JavaScript   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
17 个你需要知道的 JavaScript 优化技巧
你可能一直在使用JavaScript搞开发,但很多时候你可能对它提供的最新功能并不感冒,尽管这些功能在无需编写额外代码的情况下就可以解决你的问题。作为前端开发人员,我们必须了解...【详细内容】
2024-04-03  Search: JavaScript  点击:(4)  评论:(0)  加入收藏
你不可不知的 15 个 JavaScript 小贴士
在掌握如何编写JavaScript代码之后,那么就进阶到实践——如何真正地解决问题。我们需要更改JS代码使其更简单、更易于阅读,因为这样的程序更易于团队成员之间紧密协...【详细内容】
2024-03-21  Search: JavaScript  点击:(25)  评论:(0)  加入收藏
构建一个通用灵活的JavaScript插件系统?看完你也会!
在软件开发中,插件系统为应用程序提供了巨大的灵活性和可扩展性。它们允许开发者在不修改核心代码的情况下扩展和定制应用程序的功能。本文将详细介绍如何构建一个灵活的Java...【详细内容】
2024-03-20  Search: JavaScript  点击:(20)  评论:(0)  加入收藏
对JavaScript代码压缩有什么好处?
对JavaScript代码进行压缩主要带来以下好处: 减小文件大小:通过移除代码中的空白符、换行符、注释,以及缩短变量名等方式,可以显著减小JavaScript文件的大小。这有助于减少网页...【详细内容】
2024-03-13  Search: JavaScript  点击:(2)  评论:(0)  加入收藏
跨端轻量JavaScript引擎的实现与探索
一、JavaScript 1.JavaScript语言JavaScript是ECMAScript的实现,由ECMA 39(欧洲计算机制造商协会39号技术委员会)负责制定ECMAScript标准。ECMAScript发展史: 2.JavaScript...【详细内容】
2024-03-12  Search: JavaScript  点击:(2)  评论:(0)  加入收藏
面向AI工程的五大JavaScript工具
令许多人惊讶的是,一向在Web开发领域中大放异彩的JavaScript在开发使用大语言模型(LLM)的应用程序方面同样大有价值。我们在本文中将介绍面向AI工程的五大工具,并为希望将LLM...【详细内容】
2024-02-06  Search: JavaScript  点击:(52)  评论:(0)  加入收藏
18个JavaScript技巧:编写简洁高效的代码
本文翻译自 18 JavaScript Tips : You Should Know for Clean and Efficient Code,作者:Shefali, 略有删改。在这篇文章中,我将分享18个JavaScript技巧,以及一些你应该知道的示例...【详细内容】
2024-01-30  Search: JavaScript  点击:(65)  评论:(0)  加入收藏
使用 JavaScript 清理我的 200GB iCloud,有了一个意外发现!
本文作者在综合成本因素之下,决定用 Java 脚本来清理一下自己的 iCloud,结果却有了一个意外发现,即在 iCloud 中上传同一个视频和删除此视频之后,iCloud 的空间并不一致,这到底是...【详细内容】
2024-01-11  Search: JavaScript  点击:(97)  评论:(0)  加入收藏
JavaScript前端框架2024年展望
Angular、Next.js、React和Solid的维护者和创作者们展望2024年,分享了他们计划中的改进。译自2024 Predictions by JavaScript Frontend Framework Maintainers,作者 Loraine...【详细内容】
2024-01-05  Search: JavaScript  点击:(89)  评论:(0)  加入收藏
JavaScript开发者转向Rust的原因?
JavaScript开发者转向Rust的原因可能有很多,这里列出一些可能的原因: 性能: Rust是一种编译型语言,其性能通常优于JavaScript等解释型语言。对于需要处理大量数据或需要高并发的...【详细内容】
2024-01-04  Search: JavaScript  点击:(96)  评论:(0)  加入收藏
▌简易百科推荐
17 个你需要知道的 JavaScript 优化技巧
你可能一直在使用JavaScript搞开发,但很多时候你可能对它提供的最新功能并不感冒,尽管这些功能在无需编写额外代码的情况下就可以解决你的问题。作为前端开发人员,我们必须了解...【详细内容】
2024-04-03  前端新世界  微信公众号  Tags:JavaScript   点击:(4)  评论:(0)  加入收藏
你不可不知的 15 个 JavaScript 小贴士
在掌握如何编写JavaScript代码之后,那么就进阶到实践——如何真正地解决问题。我们需要更改JS代码使其更简单、更易于阅读,因为这样的程序更易于团队成员之间紧密协...【详细内容】
2024-03-21  前端新世界  微信公众号  Tags:JavaScript   点击:(25)  评论:(0)  加入收藏
又出新JS运行时了!JS运行时大盘点
Node.js是基于Google V8引擎的JavaScript运行时,以非阻塞I/O和事件驱动架构为特色,实现全栈开发。它跨平台且拥有丰富的生态系统,但也面临安全性、TypeScript支持和性能等挑战...【详细内容】
2024-03-21  前端充电宝  微信公众号  Tags:JS   点击:(23)  评论:(0)  加入收藏
构建一个通用灵活的JavaScript插件系统?看完你也会!
在软件开发中,插件系统为应用程序提供了巨大的灵活性和可扩展性。它们允许开发者在不修改核心代码的情况下扩展和定制应用程序的功能。本文将详细介绍如何构建一个灵活的Java...【详细内容】
2024-03-20  前端历险记  微信公众号  Tags:JavaScript   点击:(20)  评论:(0)  加入收藏
对JavaScript代码压缩有什么好处?
对JavaScript代码进行压缩主要带来以下好处: 减小文件大小:通过移除代码中的空白符、换行符、注释,以及缩短变量名等方式,可以显著减小JavaScript文件的大小。这有助于减少网页...【详细内容】
2024-03-13  WangLiwen    Tags:JavaScript   点击:(2)  评论:(0)  加入收藏
跨端轻量JavaScript引擎的实现与探索
一、JavaScript 1.JavaScript语言JavaScript是ECMAScript的实现,由ECMA 39(欧洲计算机制造商协会39号技术委员会)负责制定ECMAScript标准。ECMAScript发展史: 2.JavaScript...【详细内容】
2024-03-12  京东云开发者    Tags:JavaScript   点击:(2)  评论:(0)  加入收藏
面向AI工程的五大JavaScript工具
令许多人惊讶的是,一向在Web开发领域中大放异彩的JavaScript在开发使用大语言模型(LLM)的应用程序方面同样大有价值。我们在本文中将介绍面向AI工程的五大工具,并为希望将LLM...【详细内容】
2024-02-06    51CTO  Tags:JavaScript   点击:(52)  评论:(0)  加入收藏
JS小知识,使用这6个小技巧,避免过多的使用 if 语句
最近在重构我的代码时,我注意到早期的代码使用了太多的 if 语句,达到了我以前从未见过的程度。这就是为什么我认为分享这些可以帮助我们避免使用过多 if 语句的简单技巧很重要...【详细内容】
2024-01-30  前端达人  今日头条  Tags:JS   点击:(56)  评论:(0)  加入收藏
18个JavaScript技巧:编写简洁高效的代码
本文翻译自 18 JavaScript Tips : You Should Know for Clean and Efficient Code,作者:Shefali, 略有删改。在这篇文章中,我将分享18个JavaScript技巧,以及一些你应该知道的示例...【详细内容】
2024-01-30  南城大前端  微信公众号  Tags:JavaScript   点击:(65)  评论:(0)  加入收藏
使用 JavaScript 清理我的 200GB iCloud,有了一个意外发现!
本文作者在综合成本因素之下,决定用 Java 脚本来清理一下自己的 iCloud,结果却有了一个意外发现,即在 iCloud 中上传同一个视频和删除此视频之后,iCloud 的空间并不一致,这到底是...【详细内容】
2024-01-11    CSDN  Tags:JavaScript   点击:(97)  评论:(0)  加入收藏
站内最新
站内热门
站内头条