2016-07-08 9 views
7

मैं फ़ंक्शन प्रॉक्सी पर .toString() को कॉल करने का प्रयास कर रहा हूं।फ़ंक्शन प्रॉक्सी .toString() त्रुटियां

बस एक फ़ंक्शन प्रॉक्सी बनाना और कॉलिंग को कॉल करना "TypeError: Function.prototype.toString सामान्य नहीं है", मूल कारणों के स्रोत को वापस करने के लिए ToString को सेट करना "RangeError: अधिकतम कॉल स्टैक आकार पार हो गया", लेकिन एक बनाना ToString काम के लिए जाल प्राप्त करें।

बस स्ट्रिंग फ़ंक्शन को क्यों सेट नहीं करता है, लेकिन जाल प्राप्त करना क्यों करता है?

function wrap(source) { 
 
return(new Proxy(source, {})) 
 
} 
 
wrap(function() { }).toString()

function wrap(source) { 
 
let proxy = new Proxy(source, {}) 
 
proxy.toString = function() { 
 
    return(source.toString()) 
 
} 
 
return(proxy) 
 
} 
 
wrap(function() { }).toString()

function wrap(source) { 
 
return(new Proxy(source, { 
 
    get(target, key) { 
 
    if(key == "toString") { 
 
    return(function() { 
 
    return(source.toString()) 
 
    }) 
 
    } else { 
 
    return(Reflect.get(source, key)) 
 
} } })) } 
 
wrap(function() { }).toString()

+0

संबंधित: https: // esdiscuss। संगठन/विषय/कॉलिंग-टूस्ट्रिंग-ऑन-फ़ंक्शन-प्रॉक्सी-थ्रो-टाइपर-अपवाद – tybro0103

+0

असंबद्ध: 'वापसी' एक कीवर्ड है, न कि एक फ़ंक्शन है, इसलिए यह 'वापसी x'' वापसी नहीं है (x) '। माता-पिता यहां कुछ भी नहीं करते हैं। – Albin

उत्तर

2

TypeError: Function.prototype.toString is not generic

Function.prototype.toString जैसा लगता है Proxy पर नहीं कहा जाना चाहिए।

proxy.toString = function() { 

प्रॉक्सी के लिए यह असाइनमेंट source वस्तु को पारित कर दिया, जैसा कि आप काम के लिए जाल न करना पड़े। यदि आप source.hasOwnProperty('toString') चेक करते हैं तो आपको true मिल जाएगा। जब आप get जाल जोड़ते हैं, तो आप toString विधि नहीं बदलते हैं और इसे source ऑब्जेक्ट में नहीं जोड़ते हैं, इसलिए यह काम करता है।

अन्य संभव समाधान

function wrap(source) { 
    let proxy = new Proxy(source, {}) 
    proxy.toString = Function.prototype.toString.bind(source) 
    return proxy 
} 
0

मैं एक ही समस्या आ रहा था। अंततः मुझे पता चला कि यह this के साथ एक मुद्दा है। अपने हैंडलर के लिए एक get जाल जोड़ें, अगर यह एक function है प्रॉक्सी संपत्ति पर this के रूप में प्रॉक्सी वस्तु बाँध, और यह ठीक काम करने के लिए लगता है:

function wrap(source) { 
 
    return new Proxy(source, { 
 
     get: function (target, name) { 
 
      const property = target[name]; 
 
      return (typeof property === 'function') 
 
       ? property.bind(target) 
 
       : property; 
 
     } 
 
    }); 
 
} 
 

 
console.log(wrap(function() {}).toString());

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