跟踪更改的Javascript对象封装

是否有可能创build一个对象容器,可以跟踪更改

所述对象是数据的复杂嵌套对象。 (符合JSON)。

包装允许你获取对象,并保存更改,而不具体说明更改

这种封装是否存在devise模式?

深层克隆不是一种select,因为我试图写这样的包装,以避免这样做。

只有在没有其他解决scheme的情况下,才能考虑序列化的解决scheme。

一个使用的例子是

var foo = state.get(); // change state state.update(); // or state.save(); client.tell(state.recentChange()); 

一个jsfiddle片段可能会有所帮助: http : //jsfiddle.net/Raynos/kzKEp/

看起来像实施内部散列来跟踪更改是最好的select。

[编辑]

为了说明这是在服务器上的Node.js上完成的。 唯一改变的是该解决scheme可以针对V8实现。

剥离这个问题的JavaScript方面,只有三种方法知道是否有什么改变:

  1. 保留一份副本或代表与之比较。
  2. 观察在途中发生的变化。
  3. 被通知变化。

现在把这些概念回到JavaScript,你有以下模式:

  1. 复制:深度克隆,完整序列化或散列。
  2. 注意:强制使用setter,或者点击进入javascript引擎(不是很适用)
  3. 通知:修改使更改发布事件的代码(再次,不太适用)。

看到你已经排除了一个深刻的克隆和使用setter,我认为你唯一的select是某种forms的序列化… 在这里看到一个哈希实现 。

你必须把所有的嵌套对象封装成一个类,当某些事情发生变化的时候你会报告你。 问题是,如果只将观察者放在第一级对象中,则只会收到此对象中包含的属性的通知。

例如,假设你有这个对象:

 var obj = new WrappedObject({ property1: { property1a: "foo", property1b: 20, } }) 

如果你不包装porperty1中包含的对象,你只会收到一个property1的“get”事件,就是因为当有人运行obj.property1.property1a = "bar" ,你将会拥有唯一的交互与obj一样,将要求property1包含的对象的引用,并且修改将发生在一个不可见的对象中。

我能想到的最好的方法是在包装第一个对象时遍历所有的属性,并为每个typeOf(property) == "Object"recursion构造一个包装器对象。

我希望我对你的问题的理解是对的。 对不起,不好意思 这是我的第一个答案:$。

有一种叫做“ 反应式编程”的东西,类似于你所要求的,但是它涉及更多,可能会过度。

看来你想保留一个价值的历史,对吗? 只要你改变一个setter函数,这应该不会太难。 当然,这在JavaScript中比在其他语言中更困难。 真正的私人领域要求巧妙地使用闭包。

假设你可以做所有这些,就把这样的东西写入setter。

 function setVal(x) { history.push(value); value = x; } 

您可以使用processing.js使用的解决scheme。 编写正常访问包装对象的脚本…

 var foo = state.get(); foo.bar = "baz"; state.update(); client.tell(state.recentChange()); 

…但在浏览器(或在服务器上,如果加载速度很重要)运行之前,parsing代码并将其转换为此,

 var foo = state.get(); state.set(foo, "bar", "baz"); state.update(); client.tell(state.recentChange()); 

这也可以用来做其他有用的事情,比如操作符重载:

 // Before conversion var a=new Vector(), b=new Vector(); return a + b * 3; // After conversion var a=new Vector(), b=new Vector(); return Vector.add(a,Vector.multiply(b,3)); 

看来node-proxy通过在整个对象周围包装node-proxy实现这一点。 我会仔细研究它是如何工作的。

https://github.com/samshull/node-proxy