【问题标题】:How to Monitor the Setting of new Properties on Javascript Objects如何监控 Javascript 对象的新属性设置
【发布时间】:2013-03-01 15:44:03
【问题描述】:

每当在 Javascript 对象上设置 new 属性时,我如何获得回调......?
IE。我不知道要设置哪些属性,但希望对设置的任何属性 进行回调。

我想要的是

var obj = {};
obj.a = "something"; // triggers callback function

function callback(obj,key,val) {
    console.log(key + " was set to " + val + " on ", obj);
}

这可能吗?

【问题讨论】:

  • 为对象属性定义设置器会容易得多,这会触发您的回调。 var obj = function() { var item; this.setItem = function(param) { this.item = param; callback(param);} }

标签: javascript object properties monitoring


【解决方案1】:

您可以使用新的defineProperty

function onChange(propertyName, newValue){
...
}

var o = {};

Object.defineProperty(o, "propertyName", { 
 get: function() {return pValue; },
 set: function(newValue) { onChange("propertyName",newValue); pValue = newValue;}});

但要看你需要支持的浏览器版本。

编辑:在 Jsfiddle 上添加了 sn-p,适用于 IE10。 http://jsfiddle.net/r2wbR/

【讨论】:

  • +1 现在这很酷。我以前从未读过这种方法。我只是希望所有浏览器都支持它。
  • 刚刚在 IE9+ 中测试过。工作。
  • 根据developer.mozilla.org/en-US/docs/JavaScript/Reference/…,它适用于大多数版本的 Chrome 和 Firefox。在其他浏览器中,后续版本会提供支持。
  • 对不起,如果我不清楚,但我希望它适用于 任何 属性,包括那些我还不知道名称的属性。因此,为特定属性设置侦听器是行不通的,因为我还不知道要设置哪些属性...对于部分答案仍然 +1 :)
【解决方案2】:

最好的办法是一个setter函数,你不需要getter,

var obj = {};
setKey(obj, 'a', "something"); // triggers callback function

function setKey(obj, key, val){
    obj[key] = val;
    callback(obj, key, val);
}

function callback(obj, key, val) {
    console.log(key + " was set to " + val + " on ", obj);
}

尽可能通用,不要对所有键执行不同的功能

试试here

【讨论】:

  • 这会起作用,但我想防止使用 getter 和 setter,因为使用对象时会很混乱。仍然 +1 思考,特别感谢添加 jsfiddle 并且不要忘记触发回调:-)
【解决方案3】:

最好的办法是使用 setter 和 getter 方法。但是根据您之前的实现,您仍然可以在不使用 setter 和 getter 的情况下更改您的对象属性。因此,您应该将敏感变量设为私有。下面是一个简单的例子:

var Person = (function() {

    function Person() {};

    var _name;

    Person.prototype.setName = function(name) {

        _name = name;

    };

    Person.prototype.getName = function() {

        return _name;

    };

    return Person;

})();

var john = new Person();

john.getName();

// => undefined

john.setName("John");
john.getName();

// => "John"

john._name;

// => undefined

john._name = "NOT John";
john.getName();

// => "John"

【讨论】:

  • 这会起作用,但我想防止使用 getter 和 setter,因为使用对象时会很混乱。仍然 +1 思考。
【解决方案4】:

不幸的是,JavaScript 不会让您知道属性何时发生更改。很多时候我希望它会,但因为它不会,我不得不找到一个解决方法。不要直接设置属性,而是通过触发回调函数的 setter 方法设置它(也可能使用 getter 方法来访问属性),如下所示:

function callback(obj,key,val) {
    console.log(key + " was set to " + val + " on ", obj);
}

var obj = {};
obj.setA=function(value){
    obj.a=value;
    callback(obj,'a',value);// triggers callback function
}
obj.getA=function(){
    return obj.a;
}

obj.setA("something");

jsFiddle:http://jsfiddle.net/jdwire/v8sJt/

编辑:如果您想完全防止在没有回调的情况下更改属性,则另一种选择:

function callback(obj,key,val) {
    console.log(key + " was set to " + val + " on ", obj);
}

var obj={};
(function(){
   var a=null;
   obj.setA=function(value){
       a=value;
       callback(obj,'a',value);// triggers callback function
   }
   obj.getA=function(){
       return a;
   }
})()

console.log("a is "+obj.getA());// a is null
obj.setA("something"); // Set a to something
console.log("a is now "+obj.getA()); // a is now something
obj.a="something else"; // Set obj.a to something else to show how a is only accessible through setA
console.log("a is still "+obj.getA()); // a is still something

jsFiddle:http://jsfiddle.net/jdwire/wwaL2/

【讨论】:

  • 这会起作用,但我想防止使用 getter 和 setter,因为使用对象时会很混乱。仍然 +1 思考,特别感谢添加 jsfiddle 并且不要忘记触发回调:-)
猜你喜欢
  • 2019-03-24
  • 2013-04-11
  • 2015-03-14
  • 2019-07-20
  • 1970-01-01
  • 2018-12-02
  • 2021-07-19
  • 1970-01-01
  • 2011-10-22
相关资源
最近更新 更多