2010-06-24 10 views
8

मैं प्रोटोटाइप के लिए डिफ़ॉल्ट गेटर कैसे निर्दिष्ट कर सकता हूं? डिफ़ॉल्ट गेटर के साथ मेरा मतलब है कि एक फ़ंक्शन जिसे obj.undefinedProperty123 कहा जाता है।मैं ECMAScript 5 का उपयोग कर डिफ़ॉल्ट गेटर और सेटर को कैसे परिभाषित कर सकता हूं?

मैंने ऑब्जेक्ट.प्रोटोटाइप.get = फ़ंक्शन (प्रॉपर्टी) {..} की कोशिश की लेकिन यह इस मामले में नहीं कहा जाता है।

+1

मुझे नहीं लगता कि इसके लिए कोई तरीका है कि यहां तक ​​कि किसी भी गैर मानक कार्यान्वयन, और साथ निश्चित रूप से नहीं ECMAScript 5. साथ वहाँ एक गैर मानक कार्यान्वयन __noSuchMethod__' बुलाया 'फ़ायरफ़ॉक्स में तरीकों के लिए है, और पर आ सकते हैं क्रोम, लेकिन गैर-फ़ंक्शन गुणों के लिए कुछ भी समान नहीं है। एकमात्र मार्ग एक रैपर फ़ंक्शन का उपयोग करता है जैसे 'get' जिसके माध्यम से सभी गुणों का उपयोग किया जाता है। – Anurag

+0

संबंधित: [सभी गुण के लिए जावास्क्रिप्ट गेटर] (http://stackoverflow.com/q/994143/1048572) – Bergi

उत्तर

0

मैं तुम क्या कह रहे हैं के बारे में निश्चित नहीं हूँ। लेकिन यदि आप object.nonExistingProperty तक पहुंचने का प्रयास करते हैं तो आप एक विधि को कॉल करना चाहते हैं। मुझे नहीं लगता कि ऐसा करने का कोई तरीका है।

+0

है यही कारण है कि सिर्फ मुझे क्या करना चाहते हैं। मुझे लगता है कि यह संभव है और मुझे लगता है कि मुझे याद है कि मैंने पहले यह किया था - अगर मुझे पता चलेगा कि कैसे ... – Manuel

2

फ़ायरफ़ॉक्स यह गैर मानक noSuchMethod साथ संभव है: -

({__noSuchMethod__:function(){alert(1);}}).a(); 
4

क्या गैरेथ ने कहा, सिवाय इसके कि इसे __noSuchMethod__ है।

या शायद आप PHP के बारे में सोच रहे थे?

यहाँ हाल ही में मानकीकृत संपत्ति getters/setters पर एक बहुत अच्छा लेख, कुछ पिछले अमानक अवतारों पर प्रकाश डाला है।

http://whereswalden.com/2010/04/16/more-spidermonkey-changes-ancient-esoteric-very-rarely-used-syntax-for-creating-getters-and-setters-is-being-removed/

सारांश: कोई मानक 'कैच-ऑल' गेटर/सेटर (अभी तक) है, लेकिन Object.defineProperty भविष्य है।

3

आपको ईसीएमए 6 "प्रॉक्सी" प्रणाली के कार्यान्वयन के लिए इंतजार करना होगा, जो वास्तव में ऐसा करने के लिए डिज़ाइन किया गया है। http://wiki.ecmascript.org/doku.php?id=harmony:direct_proxies देखें।

Object.definedProperty(someObj, "someProp", { 
    get: function() { 
     console.log("you tried to get someObj.someProp"); 
     return "foo"; 
    } 
}); 

यहाँ, get समारोह किसी भी समय कोड someObj.someProp पढ़ने का प्रयास चलेंगे:

4

ECMAScript 5 में, आप केवल विशिष्ट नामित गुणों पर सेट संचालन मिल/(नहीं सार्वभौमिक सभी गुण) Object.defineProperty के माध्यम से रोक सकता ।

आगामी ECMAScript 6 मसौदा में, इस proxies के माध्यम से संभव हो जाएगा। प्रॉक्सी में अंतर्निहित लक्ष्य वस्तु होती है और फ़ंक्शन सेट/प्राप्त होती है। प्रॉक्सी की किसी भी संपत्ति पर किसी भी समय एक सेट या ऑपरेशन होता है, उचित फ़ंक्शन चलता है, प्रॉक्सी की लक्षित ऑब्जेक्ट, प्रॉपर्टी नाम का उपयोग तर्क और set प्रयास में उपयोग किए जाने वाले मान के रूप में लेता है।

var proxyHandler = { 
    get: function(obj, name){ 
     console.log("you're getting property " + name); 
     return target[name]; 
    }, 
    set: function(obj, name, value) { 
     console.log("you're setting property " + name); 
     target[name] = value; 
    } 
} 

var underlyingObj = {}; 

// use prox instead of underlyingObj to use get/set interceptor functions 
var prox = new Proxy(underlyingObj, proxyHandler); 

यहाँ, prox पर संपत्ति मूल्यों हो रही set/get कार्यों को चलाने के लिए कारण होगा के लिए सेटिंग।

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