3

Javascript オブジェクトに新しいプロパティが設定されるたびにコールバックを取得するにはどうすればよいですか? つまり
、どのプロパティが設定されるかわかりませんが、設定されたプロパティのコールバックが必要です。

私が欲しいのは

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

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

これは可能ですか?

4

4 に答える 4

4

新しいdefinePropertyを使用できます。

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

var o = {};

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

ただし、サポートする必要があるブラウザのバージョンによって異なります。

編集: Jsfiddle にスニペットを追加し、IE10 で動作します。http://jsfiddle.net/r2wbR/

于 2013-03-01T15:57:41.133 に答える
1

最良のアイデアは、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"
于 2013-03-01T16:04:17.240 に答える
1

残念ながら、JavaScript はプロパティがいつ変更されたかを通知しません。何度もそうしたいと思っていましたが、そうならないため、回避策を見つける必要がありました。プロパティを直接設定する代わりに、次のように、コールバック関数をトリガーするセッター メソッドを介して設定します (プロパティにアクセスするためにゲッター メソッドを使用することもできます)。

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/

于 2013-03-01T15:53:04.990 に答える
1

これを行う最善の方法はセッター関数です。ゲッターは必要ありません。

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);
}

すべてのキーに対して異なる機能を実行しないでください。

ここで試してみてください

于 2013-03-01T15:56:31.687 に答える