有没有办法监视对象的变化?

相反,基于用户操作触发事件,你可以只听一个对象的变化,然后做出反应?

那么,根据您使用的域,您可以使用backbone.js – 它有一个“模型”对象,您可以扩展并连接到模型更改时自动触发事件的callback – 也就是说,你在模型上设置一个字段,它会自动触发你可以听的事件。 你必须定义你的模型来扩展它的模型,并调用setter函数,而不是直接设置属性,但是它是非常有用的,我推荐它。

只是为了清楚起见,事件是从模型中触发 ,因此即使您以编程方式或在控制台中设置属性值,也会触发事件。

我写过这样的东西

https://github.com/jmoyers/mettle

person.on('name.change', function(val){ // 'a new name was committed: Yolanda' console.log('a new name was committed: ', val) }); person.name = 'Yolanda'; 

https://github.com/jmoyers/mettle/blob/master/src/model.coffee

挖掘所有的来源可能有点多。 这是一个解释:

我的项目的关键是两个概念。 一个是保持轨道一组属性,并为每个使用defineGetterdefineSetter创buildgetter和settes 。 第二个是根据你的setter中的这些属性变化来“子类化”EventEmitter和广播事件。

跟踪显示了我如何为一组键设置getter / setter。

  Model.prototype.track = function(keys) { _.each(keys, __bind(function(key) { this.tracked.push(key); this.__defineGetter__(key, __bind(function() { return this.get(key); }, this)); return this.__defineSetter__(key, __bind(function(val) { return this.set(key, val); }, this)); }, this)); return this; }; 

下面是一个如何基于“魔术”制定者进行广播的例子:

  Model.prototype.set = function(key, val) { this.attribs[key] = val; this.emit('change', this.attribs); type = key + '.change'; this.emit(type, val); }; 

这是一个简单的例子,因为我介绍了“属性中间件”,但是这显示了如何根据属性更改发出更改事件。

您可以使用getter和setter ro对属性进行更改。 约翰·雷西格(John Resig)写了很棒的文章 。