开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第15天,点击查看活动详情。
前言
学习 JavaScript 伊始,就了解到了 js 的设计模式,但是这么久了,从来没有好好的细看过它,这段时间忽然心血来潮准备再返回来看一下,毕竟有些很优秀的框架都是基于这些设计模式去设计的。
我也是从别人已经总结的一些内容中加入一些自己的理解,从而记录下来,一方面加深自己的理解,另一方面也方便日后自己再回过头来看一看。
TA是谁?
设计模式是一套代码设计 「经验的总结」。项目中 「合理的」 运用设计模式可以 「巧妙的解决很多问题」。
设计模式有很多种,而且又被按照功能分为了【创建型】【结构型】【行为型】。
其中,经典的设计模式有 23 种。随着编程语言的演进,一些设计模式(比如 Singleton)也随之过时,甚至成了反模式,一些则被内置在编程语言中(比如 Iterator),另外还有一些新的模式诞生(比如 Monostate)
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式
结构型模式,共七种:适配器模式、装饰者模式、代理模式、门面模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
TA从哪来?
大家很常用的 jQuery/vue/react 都是基于一种或者多种设计模式进行组合成的功能复杂的“对象”。
而TA从哪来也是由此展开,所谓设计模式,就是面向对象编程中各种现成的套路,也是众多前辈程序员经过长期实践总结出来的解决方案。面对不同的需求场景,选择合适的设计模式,可以提高代码的可读性,增加代码的可重用性,保证代码的可扩展性。
例如jQuery 中的 $
方法,其实就是我们在 window 对象上挂载了一个 $ 属性,他的值是由 new 关键字创建出来的一个新的对象。
;+(function (w, d) { /* 自执行函数 */
// 声明 jQuery
const jQuery = function (selector) {
this.dom = d.querySelector(selector)
return this.dom
}
// 可以实现无 new 构造
w.$ = function (selector) {
return new jQuery(selector)
}
})(window, document)
console.log($);
console.log($('body'))
console.log($('#wrap'))
$('#wrap').innerHTML = 'hello world!'
如上所示,我们就实现了一个超级超级简化版的获取 dom 节点的方法。
而所谓的设计模式也是诸如此类的一些开发思路,被整理出来的拥有特定功能的一些编写方式。
而且,一个构造函数可以使用new关键字来创造若干的实例,并且每个实例都是不同的,都是不同的地址,比较生成的实例时比较的时存储地址,因此每个实例都有不同的存储空间,两者的比较值为false。 举例:
function Person(){
this.name='cc'
}
var p1=new Person()
var p2=new Person()
console.log(p1===p2)//false
设计模式的原则(SOLID)
-
S – Single Responsibility Principle 单一职责原则
- 一个程序只做好一件事
- 如果功能过于复杂就拆分开,每个部分保持独立
-
O – OpenClosed Principle 开放/封闭原则
- 对扩展开放,对修改封闭
- 增加需求时,扩展新代码,而非修改已有代码
- 这是软件设计的终极目标
-
L – Liskov Substitution Principle 里氏替换原则
- 子类能覆盖父类
- 父类能出现的地方子类就能出现
- js中使用较少(弱类型 && 继承使用较少)
-
I – Interface Segregation Principle 接口独立原则
- 保持接口的单一独立,避免出现胖接口
- 类似于单一职责原则,这更关注接口
-
D – Dependency Inversion Principle 依赖倒置原则
- 面向接口编程,依赖于抽象而不依赖于具体
- 使用方只关注接口而不关注具体类的实现
TA 到哪去?
ta一直在,直到页面关闭 . . . (应该是吧 ^_^)