2015-09-02 8 views
9

मैं एक "लागू" जाल के साथ एक प्रॉक्सी वस्तु बनाया:सेट नहीं कर सकता "लागू" प्रॉक्सी के लिए जाल आपत्ति

var target = {}, 
    handler = { apply:() => 42 } 
    proxy = new Proxy(target, handler); 

इसलिए, प्रॉक्सी वस्तु प्रतिदेय होना चाहिए। हालांकि, यह काम नहीं करता है:

proxy(); // TypeError: proxy is not a function 

क्यों?

+0

शायद संबंधित: [ऑब्जेक्ट (गैर-) कॉल करने योग्य] बनाना (http://stackoverflow.com/q/29680473/1048572) – Bergi

उत्तर

19

[[Call]] internal method of Proxy objects की परिभाषा के अनुसार यह काम करना चाहिए:

  • जालGetMethod होने दो (हैंडलर, "apply")।
  • वापसी Call (जाल, हैंडलर, «लक्ष्य, thisArgument, CreateArrayFromList (argumentsList)»)।

हालांकि, वहाँ एक समस्या है: आंतरिक विधि यदि

एक प्रॉक्सी विदेशी वस्तु केवल एक [] [कॉल] है: नहीं सभी प्रॉक्सी वस्तुओं [[कॉल]] विधि है इसके [[प्रॉक्सी लक्ष्य]] का प्रारंभिक मान internal slot एक ऑब्जेक्ट है जिसमें एक [[कॉल]] आंतरिक विधि है।

var target =() => {}, 
    handler = { apply:() => 42 } 
    proxy = new Proxy(target, handler); 
proxy(); // 42 

ध्यान दें कि मैं target परिभाषित करने के लिए एक समारोह वस्तु जो एक निर्माता कार्य नहीं है बनाने के लिए एक तीर फ़ंक्शन का उपयोग:

इसलिए, लक्ष्य एक समारोह ऑब्जेक्ट होना चाहिए। इस तरह प्रॉक्सी ऑब्जेक्ट को बुलाया जा सकता है लेकिन तत्काल नहीं किया जा सकता है।

यदि आप "निर्माण" जाल भी जोड़ना चाहते हैं, तो लक्ष्य में [[निर्माण]] विधि होनी चाहिए, इसलिए इसे फ़ंक्शन घोषणा या फ़ंक्शन अभिव्यक्ति के साथ परिभाषित करें।

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