2010-03-01 5 views
11

निम्नलिखित जावास्क्रिप्ट उदाहरण को ध्यान में रखते:क्या जावास्क्रिप्ट ऑब्जेक्ट के लिए कैच-ऑल कुंजी जैसी कोई चीज है?

var myobj = { func1: function() { alert(name in this) }, 
       func2: function() { alert(name in this) }, 
       func3: function() { alert(name in this) } 
} 

myobj.func2(); // returns true 
myobj.func4(); // undefined function 

यह myobj के लिए एक 'कैच-ऑल' महत्वपूर्ण यह है कि कहा जाता हो जाएगा बनाने के लिए यदि संभव हो तो कोई कुंजी/समारोह परिभाषित (func4() के रूप में) है, जबकि myobj.functionCall() को बनाए रखना है प्रारूप?

+0

वास्तव में? एक को इंगित करने के लिए देखभाल? यदि आप एक पा सकते हैं, तो मैं सवाल हटा दूंगा। – user113716

+0

@ पॉइंटी - क्या आप कह रहे हैं कि आप कल्पना नहीं कर सकते कि इसे भाषा में कैसे कार्यान्वित किया जा सकता है? यदि हां, तो वाइल्डकार्ड कुंजी के बारे में * कैसे? – user113716

+0

मैं कह रहा हूं कि मैं कल्पना करने के लिए बहुत मूर्ख हूं कि इसे कैसे कार्यान्वित किया जाएगा :-) इसके अलावा, अर्थशास्त्र ऐसा लगता है कि वे जटिल होंगे; क्या आपको सिर्फ एक वाइल्डकार्ड प्रविष्टि मिल जाएगी? क्या होगा यदि आप किसी फ़ंक्शन के बजाय अपना मान 37 पर सेट करते हैं? – Pointy

उत्तर

16

आप __noSuchMethod__ लिए देख रहे हैं:
JavaScript getter for all properties

+0

हमम ... मैंने कोशिश की '__noSuchMethod__: फ़ंक्शन() {अलर्ट (' इसे पकड़ा ')}, लेकिन इसे कॉल नहीं किया जा रहा है। – user113716

+1

गलत हस्ताक्षर: '__noSuchMethod__: फ़ंक्शन (आईडी, तर्क)' –

+1

दिलचस्प ... जब मैं फ़ायरफ़ॉक्स का उपयोग करता हूं, लेकिन सफारी नहीं कहता है। – user113716

17

आप वाइल्डकार्ड 'या' कैच-ऑल 'चाबियाँ एक प्रॉक्सी और एक गेटर समारोह का उपयोग कर के साथ एक जावास्क्रिप्ट वस्तु बना सकते हैं। समाधान प्रदान की विपरीत, एक प्रॉक्सी बस किसी भी पर्यावरण के बारे में में काम करना चाहिए, Node.js

var foo = new Object() 

var specialFoo = new Proxy(foo, { 
    get(target,name) { 
     // do something here 
     return name 
    } 
}) 

console.log(specialFoo.blabla) // this will output "blabla" 

आप गुण प्रतिदेय होना चाहते हैं, तो बस एक समारोह वापसी सहित:

var specialFoo = new Proxy(foo, { 
    get(target,name) { 
     return function() { 
      console.log('derp') 
      return name 
     } 
    } 
}) 


specialFoo.callMe() // this will print derp 

विवरण: documentation on mozilla

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