2013 और 2015 अपडेट (2011 से मूल उत्तर के लिए नीचे देखें) :
यह ES2015 (उर्फ "ES6") विनिर्देश के रूप में बदल गया: जावास्क्रिप्ट में अब प्रॉक्सी है । प्रॉक्सी आपको ऐसी ऑब्जेक्ट्स बनाने देता है जो अन्य ऑब्जेक्ट्स के लिए (परदे के पीछे) वास्तविक प्रॉक्सी हैं। यहां एक सरल उदाहरण दिया गया है जो किसी भी संपत्ति मूल्यों को बदल देता है जो रिट्रीवल पर सभी कैप के लिए हैं:
"use strict";
if (typeof Proxy == "undefined") {
throw new Error("This browser doesn't support Proxy");
}
let original = {
"foo": "bar"
};
let proxy = new Proxy(original, {
get(target, name, receiver) {
let rv = Reflect.get(target, name, receiver);
if (typeof rv === "string") {
rv = rv.toUpperCase();
}
return rv;
}
});
console.log(`original.foo = ${original.foo}`); // "original.foo = bar"
console.log(`proxy.foo = ${proxy.foo}`); // "proxy.foo = BAR"
आपके द्वारा ओवरराइड किए गए ऑपरेशनों में उनका डिफ़ॉल्ट व्यवहार नहीं है। उपरोक्त सभी में, हम ओवरराइड करते हैं get
, लेकिन उन ऑपरेशनों की पूरी सूची है जिन्हें आप हुक कर सकते हैं।
में get
हैंडलर समारोह के तर्कों की सूची:
target
( original
हमारे मामले में) अनुमानित है ।
name
(निश्चित रूप से) संपत्ति का नाम फिर से प्राप्त किया जा रहा है, जो आमतौर पर एक स्ट्रिंग है लेकिन एक प्रतीक भी हो सकता है।
receiver
वह वस्तु है जिसका उपयोग this
गेटर फ़ंक्शन के रूप में किया जाना चाहिए यदि संपत्ति डेटा संपत्ति के बजाय एक एक्सेसर है। सामान्य स्थिति में यह छद्म या ऐसा कुछ है जो इसे विरासत में मिला है, लेकिन यह कुछ भी हो सकता है क्योंकि जाल द्वारा ट्रिगर किया जा सकता है Reflect.get
।
इससे आप अपने इच्छित सभी कैटर और सेटर सुविधा के साथ एक ऑब्जेक्ट बना सकते हैं:
"use strict";
if (typeof Proxy == "undefined") {
throw new Error("This browser doesn't support Proxy");
}
let obj = new Proxy({}, {
get(target, name, receiver) {
if (!Reflect.has(target, name)) {
console.log("Getting non-existent property '" + name + "'");
return undefined;
}
return Reflect.get(target, name, receiver);
},
set(target, name, value, receiver) {
if (!Reflect.has(target, name)) {
console.log(`Setting non-existent property '${name}', initial value: ${value}`);
}
return Reflect.set(target, name, value, receiver);
}
});
console.log(`[before] obj.foo = ${obj.foo}`);
obj.foo = "bar";
console.log(`[after] obj.foo = ${obj.foo}`);
उपरोक्त का आउटपुट है:
गैर-मौजूद संपत्ति 'फू' प्राप्त करना
[इससे पहले] obj.foo = अपरिभाषित
गैर-मौजूद संपत्ति 'फू' की स्थापना, प्रारंभिक मूल्य: बार
[के बाद] obj.foo = बार
ध्यान दें कि जब हम "गैर-मौजूद" संदेश प्राप्त foo
करते हैं, जब हम इसे पुनः प्राप्त करने का प्रयास करते हैं जब यह अभी तक मौजूद नहीं है, और फिर से जब हम इसे बनाते हैं, लेकिन उसके बाद नहीं।
2011 से उत्तर (2013 और 2015 के अपडेट के लिए ऊपर देखें) :
नहीं, जावास्क्रिप्ट में कैच-ऑल प्रॉपर्टी फीचर नहीं है। आप जिस एक्सेसरी सिंटैक्स का उपयोग कर रहे हैं , वह कल्पना की धारा 11.1.5 में कवर किया गया है , और ऐसा कोई वाइल्डकार्ड या ऐसा कुछ नहीं देता है।
तुम्हें पता है, निश्चित रूप से, यह करने के लिए एक समारोह को लागू कर सकता है, लेकिन मैं आप शायद का उपयोग नहीं करना चाहते हैं अनुमान लगा रहा हूँ f = obj.prop("foo");
के बजाय f = obj.foo;
और obj.prop("foo", value);
बजाय obj.foo = value;
(कार्य अज्ञात गुण संभाल करने के लिए जो आवश्यक हो जाएगा)।
FWIW, गटर फंक्शन (मैं सेटर लॉजिक से परेशान नहीं था) कुछ इस तरह दिखेगा:
MyObject.prototype.prop = function(propName) {
if (propName in this) {
// This object or its prototype already has this property,
// return the existing value.
return this[propName];
}
// ...Catch-all, deal with undefined property here...
};
लेकिन फिर, मैं कल्पना नहीं कर सकता कि आप वास्तव में ऐसा करना चाहते हैं, क्योंकि यह कैसे बदलता है कि आप ऑब्जेक्ट का उपयोग कैसे करते हैं।