原生js常用设计模式、单例,观察者、工厂
前言
今天给大家带来几种常用的设计模式的讲解、
讲解设计模式之前,我们先来说说什么是设计模式,它有什么作用。
在我看来,设计模式就是前人工作经验的总结,工作中不用设计模式也能写,但是用了设计模式能够帮助我们写出更好的代码,
设计模式的好处
提高代码的复用性,解耦代码,提高代码质量,
同时也是深入理解框架,封装一些插件时候必备的
设计原则
开放封闭原则【OCP】 简单来说,就是可扩展,不可修改
单一功能原则【SRP】 一个方法只做一件事
最少知识原则【LKP】 尽量减少对其他类的依赖,松耦合
ok,了解了原则之后,就可以开始来
第一个设计模式
工厂模式
批量生产对象,就是函数内部,生成对象实例,然后return出去。
// 工厂模式
function factoryFn(name,age){
var obj = new Object();
obj.name = name;
obj.age = age;
return obj;
}
var _obj = factoryFn('姚明','35');
console.log(_obj); // {name: "姚明", age: "35"}
原型模式
就是函数声明为空,利用prototype
原型来定义些属性和方法
function ProtoFn() {}
// 原型上添加方法
ProtoFn.prototype = {
constructor: ProtoFn, // 修复原型链
say(_n){
console.log(_n);
},
sayFn2(_n){
console.log(_n);
}
};
// 实例化
var _protoObj = new ProtoFn();
_protoObj.say('你好呀');
_protoObj.sayFn2('这是原型模式');
混合模式
就是 构造 + 原型 ,也是咱们常用的
function MixinFn(name,age) {
this.name = name;
this.age = age;
}
MixinFn.prototype.say = function(_n) {
console.log(_n);
}
var _mixin = new MixinFn('牛大力','20');
console.log(_mixin); // MixinFn {name: "牛大力", age: "20"}
_mixin.say('这是混合模式,工作中上用的多');
单例模式
同一时间只有一个实例,jq就是典型的
var singleFn = (function() {
// 装载单例的对象
var _obj = null;
// 初始化方法
function initFn(args) {
// 批量添加属性
for (var key in args) {
this[key] = args[key];
}
}
// 返回对象
return {
getInstance: function(args) {
// 单例模式,判断是否存在
if(_obj === null) _obj = new initFn(args);
return _obj;
}
}
})();
// 生成实例
var _one = singleFn.getInstance({
name: '12',
age: 18
});
console.log(_one); // initFn {name: "12", age: 18}
策略模式
简单来说,为了避免多次if,
// 加薪,a 级别 3倍,b 2倍,c 1倍
var obj = {
'A': function (money){
return money * 3;
},
'B': function (money){
return money * 2;
},
'c': function (money){
return money;
}
}
// 计算函数
var reducers = function (level,money) {
// 返回小钱钱
return obj[level](money);
}
var myMoney = reducers('A',10000);
console.log(myMoney); // 30000
观察者模式
就是我干了什么,让别人来看,
/* 发布者(被观察者)
订阅者(观察者)
主题对象(订阅都在主题对象注册)
发布消息 */
// 发布者 - 被观察者 publish 发布
var pub = {
// 方法
publish() {
// 做的一些逻辑
var xxx = 11;
// 通知订阅至
_dep.notify();
}
};
// 订阅者 -观察者
var sub1 = {
update(){
console.log(111);
}
};
var sub2 = {
update(){
console.log(222);
}
};
// 主题对象,订阅者都在主题对象中被注册
function Dep() {
this.subscribe = [sub1,sub2];
}
// notify 通知
Dep.prototype.notify = function() {
for (const item of this.subscribe) {
// 执行每一项
item.update();
}
}
// 发布消息
var _dep = new Dep();
// 发布者发布消息,主题对象执行
pub.publish();
代理模式
提供访问接口,隐藏原对象
// 主体对象
function sendMsg(msg) {
console.log(msg); //你好,是兄弟就来砍我
}
// 代理方法,过滤敏感字
function proxyFn(msg) {
if(typeof msg !== 'string') return;
var reg = /s/ig
// 过滤敏感字
msg = msg.replace(reg,'');
// 发送信息
sendMsg(msg);
}
proxyFn('你好s,是兄弟S就来砍我');
这就是比较常用的几种设计模式了,还有更多的 中介者模式、装饰模式、迭代器模式,挺多的,这里就不一一来讲了。
谢谢大家观看,有问题可以评论提呀😄!
总结一句:
设计模式就是前人经验,为了解决业务问题存在,开发时候不用刻意追求,用到时候再说了。
21 声望
0 粉丝
推荐阅读
原生js实现类jq框架
前言 今天来实现一个简单的js框架,类似jq的功能,实现了增减class,增减属性,链式调用,合并对象等功能, 更加深入理解下js原型prototype的应用,是之前承诺的原型模式应用的文章,欢迎评论交流 初始化方法 {代...
yuanfa247阅读 1.5k
ESlint + Stylelint + VSCode自动格式化代码(2023)
安装插件 ESLint,然后 File -> Preference-> Settings(如果装了中文插件包应该是 文件 -> 选项 -> 设置),搜索 eslint,点击 Edit in setting.json
谭光志赞 34阅读 20.8k评论 9
安全地在前后端之间传输数据 - 「3」真的安全吗?
在「2」注册和登录示例中,我们通过非对称加密算法实现了浏览器和 Web 服务器之间的安全传输。看起来一切都很美好,但是危险就在哪里,有些人发现了,有些人嗅到了,更多人却浑然不知。就像是给门上了把好锁,还...
边城赞 32阅读 7.3k评论 5
涨姿势了,有意思的气泡 Loading 效果
今日,群友提问,如何实现这么一个 Loading 效果:这个确实有点意思,但是这是 CSS 能够完成的?没错,这个效果中的核心气泡效果,其实借助 CSS 中的滤镜,能够比较轻松的实现,就是所需的元素可能多点。参考我们...
chokcoco赞 24阅读 2.3k评论 3
在前端使用 JS 进行分类汇总
最近遇到一些同学在问 JS 中进行数据统计的问题。虽然数据统计一般会在数据库中进行,但是后端遇到需要使用程序来进行统计的情况也非常多。.NET 就为了对内存数据和数据库数据进行统一地数据处理,发明了 LINQ (L...
边城赞 17阅读 2k
过滤/筛选树节点
又是树,是我跟树杠上了吗?—— 不,是树的问题太多了!🔗 相关文章推荐:使用递归遍历并转换树形数据(以 TypeScript 为例)从列表生成树 (JavaScript/TypeScript) 过滤和筛选是一个意思,都是 filter。对于列表来...
边城赞 18阅读 7.9k评论 3
Vue2 导出excel
2020-07-15更新 excel导出安装 {代码...} src文件夹下新建一个libs文件夹,新建一个excel.js {代码...} vue页面中使用 {代码...} ===========================以下为早期的文章今天在开发的过程中需要做一个Vue的...
原谅我一生不羁放歌搞文艺赞 14阅读 20.1k评论 9
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。