2012-02-24 48 views
4

我有这样的对象:如何检测对象的change事件的属性值?

var Settings = { 
    color: localStorage.color, 
    size : localStorage.size 
}; 

我想自动保存到localStorage的新值一旦被改变了,这意味着我想要做这样的事情:

Settings.onchange = function(p){ 
    localStorage[p] = this[p]; 
}; 

可能吗?

PS:只需要Chrome支持。

+0

你还好吗写一个属性为每一个? – Ryan 2012-02-24 03:29:13

+1

这是不可能的(你可以使用ES5 getters和setters我想)。我建议合并数据封装并使用一种方法来设置属性,例如'set(key,value)'并处理该函数内部的同步。 – 2012-02-24 03:30:08

+2

Javascript [setters and getters](http://robertnyman.com/2009/05/28/getters-and-setters-with-javascript-code-samples-and-demos/)是您的答案(但仅适用于浏览器支持他们)。 – RobG 2012-02-24 03:30:37

回答

2

根据@RobG的评论,我写了这个函数,它的工作原理!

function onPropertyChange(o, callback){ 
    for(var p in o){ 
     if(o.hasOwnProperty(p)){ 
      var originalVal = o[p]; 
      Object.defineProperty(o, p, { 
       get: function(){ 
        return originalVal; 
       }, 
       set: function(val){ 
        callback.call(o, p, val); 
        return originalVal = val; 
       } 
      }); 
     } 
    } 
} 

// example: 

var Settings = { 
    color: localStorage.color || "red", 
    size : localStorage.size || "12px" 
}; 

onPropertyChange(Settings, function(p, val){ 
    localStorage[p] = val; 
}); 

要点在这里:https://gist.github.com/1897209

+0

这可以监视已经设置的属性,当一个新的属性被添加到'Settings'时有什么回调? – 2017-03-26 16:40:19