2013-01-06 16 views
5

değiştirilip değiştirilmediğini nasıl örneğin bir nesne var kontrol etmek:bir nesne

var o = { 
    a: 1 
}; 

kullanıcı yapar: o nesne değiştirilip değiştirilmediğini

o.a = 2; 

nasıl bilebilirim? o nesnesine dokunamıyorum, böylece Object.defineProperties() kullanamıyorum.

+0

Her değişiklikten haberdar olmak istersiniz ya da kontrol etmek için bir yolunuz var mı? Sadece kontrol etmek istiyorsanız, nesnenin bir hash kodunu oluşturup gerektiğinde karşılaştırırım. – Nic

+0

Sadece kontrol etmenin bir yolu var, fakat bu karmayı nasıl oluşturabilirim? –

cevap

-1
var o_backup = o.a; 

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

Temel olarak, sadece nesnenin o den a kurtaracak bir değişken yaratıyoruz ve onu modifiye veya edilmemiş olup olmadığını o zaman kontrol ediyoruz.

Ayrıca, bir defadan fazla değiştirilmiş olup olmadığını kontrol etmek isterseniz, setInterval() işlevini de yapabilirsiniz.

+0

Suç yok ama bu çok şık bir çözüm değil. – Trevor

2

Eğer node.js ortamda ve böylece erişimci fonksiyonları ile özelliklerini tanımlamak için Object.defineProperty() kullanabilirsiniz (örneğin eski tarayıcılar) berbat eski JavaScript motorlarına umurumda gerekmez beri. Bu, belirli bir özellik okunduğunda/yazıldığında bir özel işlev yürütmenize izin verir - böylece yazmayı ve ör. ayrı bir mülkte saklayın. Bir değer o.a atanan zaman

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

__a_changed özelliği ayarlanır. Tabii ki, set işlevinde değişiklik yapmak için ne yapmak istediğinizi gerçekleştirmek için daha da temizleyici olacaktır, ancak eğer bunu yararlı bir şekilde yapabiliyorsanız, kodunuza bağlıdır.

+0

İlk yanıtla aynı, üçüncü taraf modülü olan bir yapılandırma dosyasından oluşturulduğundan 'o' nesnesine dokunamıyorum. –

+2

Tüm düz özellikleri hala erişim destekli özelliklere dönüştürebilirsiniz. – ThiefMaster

2

En basit şey, değerin, sizin başlattığınızdan farklı olup olmadığını kontrol etmek gibi görünüyor. Başka bir seçenek Object.defineProperty kullanmak olacaktır. defineProperty sizin için iş yapmazsa

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

Sorun, 'o' nesnesine dokunamıyorum çünkü bir üçüncü taraf modülüyle bir yapılandırma dosyasından oluşturuldu. –

+0

'o' nesnesine gerçekten dokunamayacağınızı varsayarak, değeri beklenen bir değere göre kontrol etmek dışında bir çok seçeneğiniz olmayabilir. Nesnenin bir özelliği değiştiğinde otomatik olarak tetiklenen olaylar yoktur. –

0

Hep kendi ayarlayıcı gaz giderici o sarabilirdiniz.

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 

Daha iyi bir çözüm bilginize, burada Underscore kütüphanenin extend yöntemini kullanıyorum Someting 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); 

exeute için Backbone.Events gibi bir şey kullanarak etkinlik yürütmek olacaktır.