网站首页 > 基础教程 正文
工厂模式
将创建对象的过程封装成函数
function newObj(name, age) {
var o = new Object();
o.name = name;
o.age = age;
return o;
}
var obj = newObj('张三', 20);
构造函数模式
属性和方法全部在构造函数里面
function ConstructorFn(name, age) {
this.name = name;
this.age = age;
this.getName = function () {
return this.name
}
}
var obj2 = new ConstructorFn('张三', 20);
原型模式
属性在构造函数里面,方法在函数的原型上
function PrototypeFn(name, age) {
this.name = name;
this.age = age;
}
PrototypeFn.prototype.getName = function () {
return this.name
}
var obj3 = new PrototypeFn('张三', 20);
单例模式
只允许实例化一次
使用场景:弹窗(登录,loading,toast等)
var Instance = (function () {
var obj;
return function () {
if (obj === undefined) obj = new PrototypeFn(...arguments);
return obj;
}
})();
var zhangsan = Instance('张三', 20);
var lisi = Instance('李四', 18);
console.log(zhangsan === lisi) // true {name: "张三", age: 20}
观察者模式
目标对象的“状态”(某个属性)发生改变后,通知它下面的所有观察者进行“更新”(回调函数处理)
使用场景 js事件监听,promise,vue双向绑定
// 目标对象
function TargetFn () {
this.state = 0;
this.obs = [];
}
TargetFn.prototype = {
// 添加观察者
addObs: function (ob) {
this.obs.push(ob)
},
// 修改状态
setState: function (val) {
this.state = val;
this.notify()
},
// 通知
notify: function () {
this.obs.forEach(ob => {
ob.update(this.state)
})
}
}
// 观察者
function Observal (name) {
this.name = name;
}
Observal.prototype.update = function (data) {
console.log(this.name, data)
}
// 创建目标对象
const targetObj = new TargetFn();
// 创建观察者
const ob1 = new Observal('ob1')
const ob2 = new Observal('ob2')
// 添加观察者
targetObj.addObs(ob1)
targetObj.addObs(ob2)
// 修改状态
targetObj.setState(1)
targetObj.setState(2)
targetObj.setState(3)
发布订阅模式
发布者,订阅者,调度者
使用场景:不同模块之间消息通信(通过自定义事件实现一个消息触发器)。比如在用户信息模块监听一个“登录成功”的自定义事件,然后在登录模块登录之后,触发这个“登录成功”的自定义事件。
function PubSub () {
// 调度者
this.handle = {}
}
// 发布者
PubSub.prototype.publish = function (eventType) {
this.handle[eventType].forEach(fn => {
fn.call(this, ...arguments)
})
}
// 订阅者
PubSub.prototype.subscribe = function (eventType, fn) {
this.handle[eventType] = this.handle[eventType] || []
this.handle[eventType].push(fn)
}
const pubsub = new PubSub();
// 监听事件
pubsub.subscribe('onlogin', function () {
console.log('登录成功', [...arguments])
})
// 触发事件
pubsub.publish('onlogin', 1,2,3)
// 监听事件
pubsub.subscribe('onlogout', function () {
console.log('退出', [...arguments])
})
// 触发事件
pubsub.publish('onlogout', 'abc')
猜你喜欢
- 2025-01-31 JS设计模式之迭代器模式(js迭代器是什么)
- 2025-01-31 一文让你搞懂javascript如何实现继承
- 2025-01-31 如何在JavaScript中实现插件模式(js插件是用来干什么的)
- 2025-01-31 SpriteJS:图形库造轮子的那些事儿
- 2025-01-31 JS设计模式之访问者模式(js 访问器属性)
- 2025-01-31 前端进阶:几个非常有意思的javascript知识点总结
- 2025-01-31 JavaScript 神奇语法糖:让你的代码更简洁高效掌握这些简写技巧
- 2025-01-31 由浅入深,带你用JavaScript实现响应式原理
- 2025-01-31 深入理解JavaScript的事件循环机制
- 2025-01-31 8个鲜为人知的JavaScript性能,你知道吗?
- 05-162025前端最新面试题之HTML和CSS篇
- 05-16大数据开发基础之HTML基础知识
- 05-16微软专家告诉你Win10 Edge浏览器和EdgeHTML的区别
- 05-16快速免费将网站部署到公网方法(仅支持HTML,CSS,JS)
- 05-16《从零开始学前端:HTML+CSS+JavaScript的黄金三角》
- 05-16一个简单的标准 HTML 设计参考
- 05-16css入门
- 05-16前端-干货分享:更牛逼的CSS管理方法-层(CSS Layers)
- 最近发表
- 标签列表
-
- jsp (69)
- pythonlist (60)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- pythonif (86)
- location.href (69)
- dockerexec (65)
- deletesql (62)
- c++模板 (62)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- console.table (62)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)