监视对象属性的更改

时间:2013-04-08 00:43:53

标签: javascript object observer-pattern

假设我有一个类似于以下内容的对象:

Cars = {
    "car_one": {
        data: {
            make: "Ford",
            model: "Festiva"
        },
        img: "car_one.jpg"
    },
    "car_two": {
        data: {
            make: "Chevy",
            model: "Pinto",
            color: "Green"
        },
        img: "car_two.jpg"
    }
    ...and so on...
}

我希望找到一种方法来监视更改的data属性(和所有子属性),然后能够设置要触发的函数。

我一直在关注Object.watch(),但测试似乎表明我需要手动设置以检查Cars.{some_car}.data的每个属性(如我的示例所示)不是常量组。我想我希望有一种不太复杂的方法,我只是不知道。

2 个答案:

答案 0 :(得分:1)

根据您对其调用方式的控制程度,您可以创建一个访问器功能。该函数可以将对象作为参数,并在设置参数时将该对象设置为当前值。为了您的使用,您可以在此处添加某种类型的触发器。如果没有传递参数,它将返回当前值。

这是knockout使用的API类型,效果很好。

在现代浏览器中,getters and setters使这一切变得简单。对于较旧的值,您可以拥有一个访问属性,然后使用另一个属性作为数据的持有者。

答案 1 :(得分:1)

不幸的是,截至今天,最简单的方法可能是循环data中的属性,并为每个属性调用Object.watch。但是,我们最终可能会Object.observe进行救援。如果您正在寻找跨浏览器Obect.watch实施,请查看here

其他替代方法是将您的数据包装在一个可观察对象中,该对象允许通过通用set方法修改数据,该方法会在修改某些属性时触发事件,或者让某些属性监视任务在特定时间间隔或由检查对象是否有更改的特定操作触发。但是,这些替代方案并不简单。