如何使用不可变对象替代观察者模式

How to use immutable objects to replace observer pattern

我很高兴 when O.o was announced but turns out it's not in the woodwork anymore. One of the advised replacement libraries 在其 github 页面上这样解释:

Web development evolved in the direction of functional programming and immutable objects, so that's where we all should look at.

虽然最近一直在听说不可变数据结构,但我仍然不知道应该如何使用它们来替代观察者模式的功能。

不可变数据结构并不能完全取代观察者模式的功能,它们只是让它变得多余。不变性仅仅意味着 "unable to change",因此观察者模式会告诉您对象何时更改,而使用不可变对象意味着它们将永远无法更改(如果您确实需要添加或删除值,那么您将创建一个新的不可变对象对象),因此您无需再担心处理更改事件。您可以使用 Immutable.js 来获取不可变的映射或列表或堆栈或其他复杂的数据结构(并且您可能需要阅读该页面上的 不可变性 的案例)。或者你可以使用普通的 javascript(ES5.1 中引入的 Object.freeze 函数)使对象文字不可变:

var o = { a: 99 };
Object.freeze(o); // make o immutable
o.a = 100; // a still equals 99, this assignment silently fails because o is immutable

我想你误解了那个消息。

不可变数据和观察者(响应式编程)是一对绝妙的搭档。只是 Object.observe 特别变得多余 - 如果 Object 没有改变,那么你到底想 observe 做什么?

您链接到的库是针对(尚)不支持 Object.observe ECMA 标准的浏览器的兼容性补丁。由于标准收回了接口,这不再有效。这并不意味着有人不能将它作为一个库保存——它只是意味着它不再是一个兼容性补丁。这就是评论的全部含义,IMO。

Change and its detection in Javascript frameworks 是关于该主题的非常好的读物。最后一点,Om,基本上讨论了对不可变数据的反应式方法,有很多链接供更深入的研究。当然,我仍然建议阅读整篇文章 - 它很好地概述了多年来状态更改方法的变化,因此,为您提供了您想要的详细信息 - 我们的旧方法有哪些问题被新方法解决了( 50 岁 :P) 范式。请注意,只有状态本身是不可变的 - 您可以很好地切换状态,这就是您正在观察的事情。