在 JavaScript 中,依赖对 "listen" 的对象引用进行更改是一种好习惯吗?

In JavaScript, is it a good practice to depend on object references to "listen" for changes?

我必须实现一个类似于存储库模式的对象来维护一个项目列表。回购看起来像这样:

var repository = {

    data: [],

    getAll: function() {
        return this.data;
    },

    update: function() { ... }
}

回购数据的最终消费者将是某个组件。我正在考虑利用对 repo 数据数组的引用,以便在 DOM 发生变化时更新它:

function ItemList() {
    this.data = repository.getData();

    when (this.data is changed) {
        update the view
    }

    this.userInput = function() {
        repository.update();
    }
}

虽然它感觉很简洁并且据说使用了合法的功能,但这真的是个好主意吗?我应该在存储库中使用 observer/notifications 吗?

var repository = {
    ...
    onDataChange: function(callback) { ... }
}

您可以在此处找到示例(使用 Angular):http://jsfiddle.net/xen8m148/

取决于您如何实现绝对非内置 "is changed" =) 通常,如果您想减少虚假处理,publish/subscribe 模型更好。如果您不关心浪费 cpu 周期,那么您可以使用 Object.observe 查看对象更改。

不过,从软件工程的角度来看,您似乎在两个所有者之间共享您的数据,而这(而不是您如何监听更改)在未来可能是一个更大的问题.

我通常认为如果您正在与存储库通信,则 pub/sub 模式是不必要的。假设您的应用程序正在使用存储库将 CRUD 抽象为系统中所有数据的底层持久化机制,那么这个存储库实际上是架构的重要组成部分。

如果通信模块不知道彼此的存在,pub/sub 模式很有用。如果 module/object 试图与 repository 这样的建筑对象进行通信,它已经按照约定知道了 repository。如果存储库已经作为一个接口,一个底层复杂性的抽象,为什么你希望你的模块不知道这个接口?

但是,如果您不确定存储库是否属于您的体系结构的一部分,或者如果您只是希望数据和存储库最大程度地完全分离,那么 pub/sub 是可行的。

也就是说,我相信对于像 JS 这样的前端解释型语言,更直接的方法通常是更好的方法。我一直使用 pub/sub 进行组件通信,但我只是不认为它们需要用于架构层之间的通信,接口就足够了。事实上,如果您将 pub/sub 模式走得太远,您可能会在发布-订阅消息中遇到命名空间问题。