2009-06-30 12 views
19

जावास्क्रिप्ट प्रलेखन के माध्यम से जा रहे हैं में मूल्य परिवर्तन, मैं निम्नलिखित दो कार्य पाया पर एक जावास्क्रिप्ट वस्तु दिलचस्प लग रहा है:संपत्ति के लिए श्रोता का javascript ऑब्जेक्ट

.watch - घड़ियाँ एक संपत्ति के लिए एक मूल्य सौंपा और एक समारोह जब चलाता जा करने के लिए ऐसा होता है।
.unwatch - घड़ी विधि के साथ एक घड़ी बिंदु सेट हटा देता है।

नमूना उपयोग:

o = { p: 1 }; 
o.watch("p", function (id,oldval,newval) { 
    console.log("o." + id + " changed from " + oldval + " to " + newval) 
    return newval; 
}); 

जब भी हम "पी" की संपत्ति के मूल्य बदलने के लिए, इस समारोह ट्रिगर किया जाता है।

o.p = 2; //logs: "o.p changed from 1 to 2" 

मैं तेजी से कुछ वर्षों के लिए जावास्क्रिप्ट पर काम कर रहा हूँ और कभी नहीं इन कार्यों के लिए इस्तेमाल किया।
क्या कोई कृपया कुछ अच्छे उपयोग मामलों को फेंक सकता है जहां ये कार्य आसान होंगे?

+2

ये केवल छिपकली आधारित ब्राउज़र के लिए उपलब्ध हैं, मोज़िला फ़ायरफ़ॉक्स की तरह। इंटरनेट एक्सप्लोरर ऑब्जेक्ट्स पर एक समान विधि का खुलासा करता है, जिसे ऑनप्रोपर्टीचेंज कहा जाता है। –

उत्तर

8

संपत्ति मूल्यों की पुष्टि के लिए वास्तव में किस घड़ी को डिज़ाइन किया गया है। उदाहरण के लिए आप को मान्य हो सकता है कि कुछ एक पूर्णांक है:

obj.watch('count', function(id, oldval, newval) { 
    var val = parseInt(newval, 10); 
    if(isNaN(val)) return oldval; 
    return val; 
}); 

आप स्ट्रिंग की लंबाई को मान्य करने के लिए इसे इस्तेमाल कर सकते हैं:

obj.watch('name', function(id, oldval, newval) { 
    return newval.substr(0, 20); 
}); 

हालांकि, इन Spidermonkey javascript इंजन के नवीनतम संस्करण में ही उपलब्ध हैं । बढ़िया है यदि आप जैक्सर का उपयोग कर रहे हैं या स्पाइडरमोन्की इंजन को एम्बेड कर रहे हैं, लेकिन वास्तव में अभी तक आपके ब्राउज़र में उपलब्ध नहीं है (जब तक आप एफएफ 3 का उपयोग नहीं कर रहे हों)।

+1

हेड अप, अब सभी आधुनिक ब्राउज़रों में उपलब्ध है। सुझाव: इसके बजाय गेटर और सेटर का उपयोग करें। –

8

Object.defineProperty और Object.prototype.\__defineGetter__ (या \__defineSetter__) देखें कि यह कार्यक्षमता कहां चल रही है।

Object.defineProperty जल्द ही सभी समकालीन ब्राउज़रों में उपलब्ध होना चाहिए।

1

आप Javascript Propery Events लाइब्रेरी पर एक नज़र डाल सकते हैं। यह एक छोटी लाइब्रेरी है जो Object.defineProperty को कुछ ईवेंट कॉलर्स के साथ विस्तारित करती है, जिसे मैंने हाल ही में बनाया था। इसमें कुछ on[event] गुण जोड़े गए हैं जिनका उपयोग HTML-ऑब्जेक्ट्स के on[event] गुणों जैसे किया जा सकता है। इसमें एक साधारण प्रकार की जांच भी होती है, जो onerror ईवेंट को विफल होने पर कॉल करती है।

अपने कोड यह कुछ इस तरह के परिणामस्वरूप ले रहा है:

var o = {} 
Object.defineProperty(o, "p", { 
    value:1, 
    writable:true, 
    onchange:function(e){ 
     console.log("o." + e.target + " changed from " + e.previousValue + " to " + e.returnValue); 
    } 
}) 
संबंधित मुद्दे