前端常见设计模式之发布订阅模式

基础

观察者模式是对象的行为模式,又叫发布订阅者模式,模型视图模式,监听者模式或者 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 种变化

  1. add

  2. update

  3. delete

  4. reconfigure

  5. setPrototype

  6. preventExtensions

我们也可以自建监听事件

代理是可以在动作发生之前拦截的。对象观察支持在变化(或一组变化)发生后响应。

object.defineProperty

object.defineProperty(obj, prop, descriptor) obj: 定义属性的对象 prop: 定义或修改的属性的名称 descriptor:将被定义或修改的属性描述符

默认情况下,object.defineProperty()添加的属性值是不可修改的。

数据劫持的优点:

数据劫持的缺点:

  1. 一个属性我们不可能提前定义,也不可能一个属性一个属性的写上去.

  2. 代码耦合度很高。

object.proxy

Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程。 下面我们来看一个例子:

对比 object.defineProperty 和 proxy 的 优缺点:

  1. Object.defineProperty 的第一个缺陷,无法监听数组变化。

  2. Proxy 可以直接监听对象而非属性

发布-订阅模式

简单版

复杂版

原生 与 jquery

Nodejs

最后更新于

这有帮助吗?