2010-05-05 9 views
9

अंतर्निहित जावास्क्रिप्ट ऑब्जेक्ट का उपयोग करके एक साधारण उदाहरण: navigator.my_new_property = "कुछ मान"; // क्या हम पता लगा सकते हैं कि यह नई संपत्ति जोड़ दी गई थी?पता लगाएं कि जावास्क्रिप्ट ऑब्जेक्ट में कोई नई प्रॉपर्टी कब जोड़ा जाता है?

मैं लगातार नए गुणों के लिए जाँच करने के लिए वस्तु मतदान नहीं करना चाहती। क्या संपत्ति की निगरानी करने के लिए स्पष्ट रूप से बताते हुए ऑब्जेक्ट्स के लिए कुछ प्रकार का उच्च स्तरीय सेटटर है?

फिर से, मैं नहीं चाहता कि यदि संपत्ति के मूल्य बदल पता लगाने के लिए जब एक नया संपत्ति जोड़ दिया जाता है चाहता हूँ, बल्कि।

विचार? धन्यवाद

उत्तर

6

नहीं। जब कोई संपत्ति लिखी जाती है तो निर्धारित करने के मौजूदा तरीके:

  • defineProperty(obj, name, fn) का उपयोग करके परिभाषित एक ईसीएमएस्क्रिप्ट 5 सेटटर;
  • __defineSetter__(name, fn) का उपयोग करके परिभाषित एक विरासत जावास्क्रिप्ट सेटर;
  • एक विरासत नेटस्केप/मोज़िला watch(name, fn);

सब नाम के आधार पर कर रहे हैं, इसलिए नहीं पकड़ सकते नई प्रॉपर्टी किसी पूर्व-अज्ञात नाम के साथ लिखा जा रहा है। किसी भी मामले में, navigator एक 'होस्ट ऑब्जेक्ट' हो सकता है, इसलिए आप उस पर उपलब्ध सामान्य जावास्क्रिप्ट Object इंटरफेस पर भरोसा नहीं कर सकते हैं।

मतदान, या स्पष्ट सेटर तरीकों कि कॉलबैक प्रदान करते हैं सब आप कर सकते हैं के बारे में है।

इसी स्थिति: es6 proxies on MDN: Getter/setter on javascript array?

+0

विस्तृत प्रतिक्रिया के लिए धन्यवाद:

यहाँ एक सरल उदाहरण है। यदि मैं मतदान मार्ग पर जाता हूं, तो आप एमएस में एक अच्छा अंतराल मानेंगे? जाहिर है, मैं चाहता हूं कि यह प्रभावी हो लेकिन अनावश्यक रूप से दोहराना न पड़े। क्या कोई "मानक" अंतराल है कि कुछ ढांचे उनके मतदान के लिए उपयोग करते हैं? सुझावों की सराहना की जाती है। – UICodes

+0

मुझे लगता है कि यह वही निर्भर करेगा जो आप करना चाहते हैं; कोई जवाब नहीं है। आप किस वस्तु को मतदान कर रहे हैं, आप कितनी बार इसे बदलने की उम्मीद करते हैं, इसके माध्यम से कितने अन्य गुण परिभाषित किए जाते हैं? जबकि आप एक आधुनिक डेस्कटॉप ब्राउज़र पर 50ms की तरह बहुत छोटे अंतराल से दूर हो सकते हैं, IEMobile6 जैसे कमजोर ब्राउज़र पर अच्छी तरह से आबादी वाले ऑब्जेक्ट के लिए जो इसे अपने घुटनों तक ला सकता है! संयोग से, 'नेविगेटर' जैसी होस्ट ऑब्जेक्ट्स के लिए कोई भी गारंटी नहीं है कि किसी भी नई संपत्ति को सेट करना, या 'इन ... इन' को फिर से चालू करने के लिए उपयोग करना, काम करेगा! : -एस – bobince

+0

आप पहले से ही कई होस्टेड ऑब्जेक्ट्स पर संपत्ति परिवर्तनों को कैप्चर नहीं कर सकते हैं (उदाहरण के लिए, विभिन्न डीओएम ऑब्जेक्ट गुणों पर गेटर/सेटिंग को परिभाषित करने का प्रयास करें), इसलिए मुझे कोई समस्या नहीं दिखाई दे रही है जो सामान्य ऑब्जेक्ट चेंज नोटिफ़ायर प्रदान करेगी कारण। – Michael

1

ES6 प्रॉक्सी की अवधारणा प्रस्तुत करता है।

let objectToSpy = {}; 
let handler = { 
    set: (target, prop, value)=>{ 
     console.log('new prop:', prop); 
     target[prop] = value; 
    } 
}; 

let proxy = new Proxy(objectToSpy,handler); 
proxy.testProp = 'bla'; //prints: "new prop: testProp" 
+0

यह प्रत्येक संपत्ति परिवर्तन पर लॉग ऑन करेगा, लेकिन एक अतिरिक्त if-स्टेटमेंट जोड़ना नौकरी करेगा। [फीडल] (https://jsfiddle.net/apt1e1a9/4/) धन्यवाद – dwonisch

संबंधित मुद्दे