前端常见设计模式之发布订阅模式
基础
观察者模式是对象的行为模式,又叫发布订阅者模式,模型视图模式,监听者模式或者 Dependents 模式。发布-订阅
脏检测
数据劫持
数据模型
publish subscribe
object.observe object.defineProperty object.proxy
对象存在两种熟悉描述符:
- 数据描述符 数据描述符是一个具有值的属性,该值可能是可写的,也可能不是可写的。
- 存取描述符 存取描述符是由getter-setter函数对描述的属性。
描述符必须是这两种形式之一;不能同时是两者。
数据描述符 和 存取描述 都具有
- configure 为true时,该属性描述符才能改变,默认为false
- enumerable 为true时,该属性能够出现在对象的枚举属性中,默认为false
数据描述符:
- value 可以是任何有效的 javascript,默认为undefined
- writable 当且仅当为 true时, value才能被赋值运算符改变,默认为false
存取描述符:
- get 给一个属性提供getter方法,如果没有 getter 则为 undefined。方法执行时没有参数传入,但是会传入this对象 默认为undefined
- set 给一个属性提供setter方法,当属性值修改时,触发执行该方法。该方法将接受唯一参数,即该属性新的参数值。object.observe()
object.observe API 可以被称为一种“可以对任何对象的属性值修改进行监视的事件处理函数”。 可以观察的改变有 6 种变化
add
update
delete
reconfigure
setPrototype
preventExtensions
我们也可以自建监听事件
代理是可以在动作发生之前拦截的。对象观察支持在变化(或一组变化)发生后响应。
object.defineProperty
object.defineProperty(obj, prop, descriptor) obj: 定义属性的对象 prop: 定义或修改的属性的名称 descriptor:将被定义或修改的属性描述符
默认情况下,object.defineProperty()添加的属性值是不可修改的。
数据劫持的优点:
数据劫持的缺点:
一个属性我们不可能提前定义,也不可能一个属性一个属性的写上去.
代码耦合度很高。
object.proxy
Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程。 下面我们来看一个例子:
对比 object.defineProperty 和 proxy 的 优缺点:
Object.defineProperty 的第一个缺陷,无法监听数组变化。
Proxy 可以直接监听对象而非属性
发布-订阅模式
简单版
复杂版
原生 与 jquery
Nodejs
最后更新于
这有帮助吗?