7

たとえば、次のようなオブジェクトがあります。

var o = {
  a: 1
};

ユーザーは次のことを行います。

o.a = 2;

oオブジェクトが変更されたかどうかを知るにはどうすればよいですか? 物に触れられないoので使えませんObject.defineProperties()

4

4 に答える 4

3

あなたは node.js 環境にいるので、粗悪な古い JavaScript エンジン (つまり古いブラウザー) を気にする必要がないので、アクセサー関数Object.defineProperty()でプロパティを定義するために使用できます。これにより、特定のプロパティが読み書きされるたびにカスタム関数を実行できます。そのため、書き込みを簡単にログに記録して、別のプロパティに保存することができます。

var o = {};
Object.defineProperty(o, 'a', {
    get: function() {
        return this.__a;
    },
    set: function(value) {
        this.__a = value;
        this.__a_changed = true;
    }
});
o.__a = 1;

プロパティに値が割り当てられるたびに設定されo.aます。__a_changedもちろん、関数内で変更時にやりたいことを実行する方がよりクリーンになりsetますが、便利な方法で実行できるかどうかは明らかにコードに依存します。

于 2013-01-06T00:08:49.193 に答える
2

最も簡単な方法は、値が初期化した値と異なるかどうかを確認することです。別のオプションは、を使用することObject.definePropertyです。

var o = {};
var aValue = 2;
Object.defineProperty(o, "a", { 
    get: function() { return aValue; }, 
    set: function(newValue) { 
        aValue = newValue;
        // trigger event or set flag that it was changed
    } 
});
于 2013-01-06T00:09:55.917 に答える
0

がうまくいかない o場合は、いつでも独自のセッターゲッターでラップできます。defineProperty

var myO = {
    o: o, // original o
    changed: false,
    set: function (prop, val) {
        this.o[prop] = val;
        this[prop + "IsChanged"] = true;
    },
    get: function (prop) {
       return this.o[prop];
    }
};
myO.set("a", 2);
console.log(myO.aIsChanged); // true

より良い解決策は、何かを実行するようなものを使用してイベントを実行することBackbone.EventsですmyO.on("change", function () { ... })

var myO = {
        o: o, // original o
        changed: false,
        set: function (prop, val) {
            this.o[prop] = val;
            this.trigger("change", prop, val);
        },
        get: function (prop) {
           return this.o[prop];
        }
    };

_.extend(myO, Backbone.events);

myO.on("change", function (prop, val) {
   // Do stuff with the change
});

myO.set("a", 1);

Underscoreここではライブラリのextendメソッドを使用しています。

于 2013-01-06T03:56:48.213 に答える
-1
var o_backup = o.a;

if(o.a != o_backup){
// function to execute
}

a基本的には、オブジェクトからを保存する変数を作成し、oそれが変更されているかどうかを確認しているだけです。

また、setInterval()複数回変更されているかどうかを確認したい場合は、関数を実行できます。

于 2013-01-06T00:05:32.623 に答える