我可以使用什么事件来检测对象中的值更改并获取更改值的键?

时间:2016-07-17 20:06:55

标签: javascript jquery javascript-objects key-value

我有一个包含一些(简单)import QtQuick 2.0 import QtQuick.Controls 2.0 ApplicationWindow { Button { onClicked: chat.sendMessage(...) } } 对的Object,如下所示:

key: value

var things = { "0": "apple", "1": "mango", "2": "pear" // ect... }; 中是否有内置函数或方法可用于侦听对象值的更改?

也许是这样的:

Object.prototype

我不介意使用jQuery,浏览器支持并不是首要任务,因此也欢迎使用非标准和/或自定义方法。< BR />

4 个答案:

答案 0 :(得分:1)

您可以使用更通用的setter函数,并使用它(如果适用)(您可以控制设置值)。

this.timeout(20000);

答案 1 :(得分:1)

通常情况下,您可以使用一个函数来设置值并从那里调用它,但如果您必须确保在更改时调用它,则可以使用Proxy。这允许您在设置属性时调用函数。

var trueThings = new Proxy(things, {
  set: // your function here
});

EDIT 10/03/2016:

有一种更广泛支持的强制它通过该函数的方法,那就是创建一个shell对象,使用closure访问主对象。就像Proxy一样,它包装对象(保持私有)并提供操作它的工具。您可以使用以下函数创建它:

function makeShell(obj) {
    function setCallback(k, v, obj) {
        // your callback here
    }

    return {
        get: function(k) {
            return obj[k];
        },
        set: function(k, v) {
            setCallback(k, v);
            obj[k] = v;
        }
    }
}

答案 2 :(得分:0)

您可以创建元素,将元素属性设置为对象属性,使用MutationObserver

var things = {
  "prop-0": "apple",
  "prop-1": "mango",
  "prop-2": "pear"
    // ect...
};

var obj = document.createElement("div");

for (var prop in things) {
  obj.setAttribute(prop, things[prop])
};

var target = obj;

var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    things[mutation.attributeName] = obj.getAttribute(mutation.attributeName);
    console.log(obj.getAttribute(mutation.attributeName)
               , things);
  });
});

var config = {
  attributeFilter: Object.keys(things)
};

observer.observe(target, config);

obj.setAttribute("prop-0", "abc");

答案 3 :(得分:0)

以下是最终产品及其Slayther answer的修改版本:

var things = {
  "0": "apple",
  set: function(key, val) {
    var old = (this[key]) ? this[key] : null;
    this["OLD_" + key] = old;
    this[key] = val;
    this.onchange(key, val, old);
  },
  onchange: function(key, value, old) {
    // handle "onchange" business here
  }
};

things.set("0", "pear");

再次感谢Slayther,对于那些希望看到这一点的人,demo上有Codepen结束。