2016-04-04 3 views
6

चलो कहते हैं कि मैं एक regexp जो मैं एक प्रॉक्सी के माध्यम से हैंडल करना चाहते हैं करते हैं (में जाल संपत्ति के लिए आदेश तक पहुँचता आदि):प्रॉक्सी पर जाएं और बॉक्सिंग पुरातन

proxy = new Proxy(/x/, {}); 

लेकिन जब मैं के रूप में प्रॉक्सी का उपयोग करने की कोशिश एक regexp:

proxy.test('x') 

मैं

Uncaught TypeError: Method RegExp.prototype.test called on incompatible receiver [object Object]

इसी तरह की त्रुटि 'x'.match(proxy) के साथ होती है। 6 के एक मूल्य की उम्मीद कर

proxy = new Proxy(Object(5), {}); 

लेकिन जब मैं एक अभिव्यक्ति के हिस्से के रूप प्रॉक्सी का उपयोग करने का प्रयास करें,:

या एक बॉक्स्ड आदिम को प्रॉक्सी पर विचार

proxy + 1 

मैं

मिल

Uncaught TypeError: Number.prototype.valueOf is not generic(…)

तो मेरी प्रश्न हैं:

  1. कर सकते हैं मैं इस तरह से है कि इस तरह के regexp.test के रूप में निर्माण में करता है regexp के रूप में प्रॉक्सी कार्यों में प्रॉक्सी एक regexp?

  2. क्या मैं इस तरह से एक बॉक्सिंग आदिम प्रॉक्सी कर सकता हूं कि valueOf व्यवहार काम जारी है?

उत्तर

3

अंतर्निहित प्रकार/ऑब्जेक्ट्स को "आंतरिक स्लॉट" कहा जा सकता है जो उस स्थिति को ले जाता है जो बाहर से उपलब्ध नहीं है। कुछ विधियां इस स्थिति पर निर्भर करती हैं और इसलिए यदि यह गुम हो जाती है तो संचालित नहीं हो सकती है।

ये आंतरिक स्लॉट मानक माध्यमों के माध्यम से सुलभ नहीं होते हैं जब कोई ऑब्जेक्ट प्रॉक्सी होता है। विनिर्देश को देखते हुए आपको अक्सर का सामना करना पड़ेगा "यदि एक्स में [[y]] आंतरिक स्लॉट नहीं है तो एक टाइप एरर अपवाद फेंक दें"। यही कारण है कि प्रॉक्सिंग अंतर्निर्मित प्रकार अक्सर अपेक्षा के अनुसार काम नहीं करते हैं। इसी कारण से आप Number.prototype.valueOf.call({}) जैसे कुछ नहीं कर सकते हैं।

का संभावित हल प्रॉक्सी का लक्ष्य के लिए सीधे समारोह बाध्य करने के लिए है:

var proxy = new Proxy(/x/, { 
    get: function(target, key) { 
    if (typeof target[key] === 'function') { 
     return target[key].bind(target); 
    } 

    return target[key]; 
} 
}); 

यह उदाहरण हर कॉल पर एक नया कार्य बनाता है। एक अधिक परिष्कृत समाधान कार्यों को कैश करेगा और केवल समस्याग्रस्त तरीकों के लिए एक नया कार्य करेगा।

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