2013-03-06 3 views
7

मैं क्या समझ से, पूर्व इच्छा:Object.prototype.toString.apply (मान) value.toString() से अलग कैसे है?

  1. value पर
  2. कॉल यह वस्तु पर toString विधि खोज लेकिन this साथ value

और value.toString() इच्छा करने के लिए बाध्य।

  1. समारोह मंगलाचरण पैटर्न

के माध्यम से मूल्य के रूप में this साथ बंधे हुए मूल्य पर value के प्रोटोटाइप श्रृंखला

  • कॉल toString में कहीं toString विधि खोज तो फर्क है, अगर वहाँ है एक अधिरोहित toString मूल्य में विधि ... यह इसका उपयोग करेगा।

    मेरा प्रश्न है:

    1. है कि फर्क सिर्फ इतना है?
    2. इसके विपरीत, क्या यह पैटर्न मानक पैटर्न है यदि हम गारंटी चाहते हैं कि हम Parent की विधि को कॉल कर रहे हैं और संभावित रूप से कुछ Child द्वारा ओवरराइड नहीं हैं? (इस मामले में अभिभावक = ऑब्जेक्ट, चाइल्ड = क्लास वैल्यू आता है, अगर हम क्लासिकल और विधि = टूस्ट्रिंग सोच रहे हैं।)
  • +0

    मुझे आपके अंतिम अनुच्छेद को समझ में नहीं आता है। आप क्या पूछ रहे हो? –

    +0

    @ExplosionPills धन्यवाद, उम्मीद है कि अधिक स्पष्ट हो जाएगा। – djechlin

    उत्तर

    6

    Object.prototype.toString.apple(value) आपको null पर कॉल करने देगा, जबकि आप null.toString() का उपयोग करते हैं, तो यह एक त्रुटि उत्पन्न करेगा।

    Object.prototype.toString.apply(null); 
    >"[object Null]" 
    
    null.toString(); 
    >TypeError: Cannot call method 'toString' of null 
    
    +0

    यह वास्तव में बात नहीं है। 'Null' का उचित' .toString() 'मूल्यांकन' "ऑब्जेक्ट नल]" ''नहीं है, बल्कि' null "'। जब आप 'Object.prototype.toString' के संदर्भ के रूप में मान पास करते हैं, तो यह आपको इसकी आंतरिक * [[कक्षा]] * संपत्ति का मान देता है, जो प्रकार की जांच के लिए उपयोगी है। [ईसीएमएस्क्रिप्ट 9.8 टूस्ट्रिंग] (http://es5.github.com/#x9.8) –

    +0

    प्रश्न का पालन करें: जब मैं कंसोल में ऑब्जेक्ट.प्रोटोटाइप टाइप करता हूं, तो मुझे ऑब्जेक्ट {} लगता है (जिसका मतलब है कि प्रोटोटाइप एक खाली है * ऑब्जेक्ट), लेकिन मुझे लगता है कि toString() जैसी विधियां वास्तव में ऑब्जेक्ट.प्रोटोटाइप में लागू की गई हैं। तो यह क्यों दिखाता है कि ऑब्जेक्ट.प्रोटोटाइप एक खाली वस्तु है? – Elisabeth

    2

    हां, आपको यह अधिकार मिला है। मैं आम तौर पर Object.prototype.toString को कॉल करने वाले लोगों को सीधे नहीं देखता हूं, हालांकि (आमतौर पर ऑब्जेक्ट्स को toString विधि ओवरराइड करने के लिए कुछ समझदारी होती है) लेकिन यह निश्चित रूप से बहुत ही आम है और Object.prototype.hasOwnProperty जैसे कुछ अन्य तरीकों के लिए अनुशंसित है।

    +0

    बाद के मामले में इसकी सिफारिश क्यों की जाती है? – djechlin

    +0

    जब हम वस्तुओं को "गूंगा हैश-टेबल" के रूप में उपयोग करते हैं, तो आपको यह देखने के लिए है कि एक कुंजी मौजूद है या नहीं (क्योंकि हम संपत्ति श्रृंखला में चीजों को गिनना नहीं चाहते हैं)। ऑब्जेक्ट.प्रोटोटाइप से "असली" हैऑनप्रोपर्टी का उपयोग करना केस के खिलाफ सुरक्षा करता है अगर कोई हैश टेबल की कुंजी के रूप में "hasOwnProperty" जोड़ता है। – hugomg

    +1

    'Object.prototype.toString' अन्य देशी प्रोटोटाइप पर पाए गए' .toString() 'विधि के लिए एक विकल्प नहीं है। यह 'ऑब्जेक्ट.प्रोटोटाइप.hasOwnProperty' करने के लिए तुलनीय नहीं है क्योंकि किसी भी अन्य प्रोटोटाइप पर परिभाषित अद्वितीय' .hasOwnProperty' विधि नहीं है। –

    5

    Object.prototype.toString क्या उत्तरार्द्ध है पर निर्भर करता है value.toString() तुलना में एक अलग तरीका हो सकता है।

    > Object.prototype.toString.apply("asdfasdf") 
    "[object String]" 
    > "asdfasdf".toString() 
    "asdfasdf" 
    > Object.prototype.toString.apply(new Date) 
    "[object Date]" 
    > (new Date).toString() 
    "Tue Mar 05 2013 20:45:57 GMT-0500 (Eastern Standard Time)" 
    

    .prototype[function].apply (या .call या .bind) यदि आप एक विधि के संदर्भ बदलने के लिए भले ही संदर्भ बिल्कुल ऐसी पद्धति नहीं हो सकता अनुमति देते हैं।

    var o = {}; 
    o.prototype = {x: function() { console.log('x'); }} 
    var y = {} 
    o.prototype.x.call(y) 
    y.x(); //error! 
    

    ... ताकि है कहना है कि

    1. यह फर्क सिर्फ इतना है
    2. यह आवश्यक रूप से माता पिता और बच्चे के बीच एक संबंध से कोई लेना देना नहीं है नहीं है .. यह सिर्फ अनुमति देता है आप एक ऑब्जेक्ट की विधि (या किसी भी फ़ंक्शन) को एक अलग ऑब्जेक्ट संदर्भ के साथ कॉल करने के लिए कहते हैं।
    संबंधित मुद्दे