2016-12-18 6 views
5

के The Good Parts किताब से उदाहरण लेते हैं:'Array.prototype' का उपयोग कब करें और जावास्क्रिप्ट में 'यह' कब उपयोग करें?

Array.method('unshift', function() { 
    this.splice.apply(this,[0,0].concat(Array.prototype.slice.apply(arguments))); 
    return this; 
}); 

लेखक का उपयोग क्यों एक ही स्थान पर this.splice और अन्य में Array.prototype.slice किया?

मैं एक दूसरे के साथ this और Array.prototype बाहर गमागमन की कोशिश की और निम्नलिखित की तरह त्रुटियों मिला:

TypeError: Cannot read property 'slice' of undefined

लेकिन मैं अभी भी के बारे में, पता है कि कैसे करने के लिए जब this या Array.prototype का उपयोग करना चाहिए यकीन नहीं है।

+1

बहुत संबंधित के रूप में: http: // stackoverflow .com/q/7056925/476 – deceze

+0

यह पुस्तक जावास्क्रिप्ट से शुरू करने के लिए कभी भी एक बहुत अच्छा तरीका नहीं था, लेकिन अब यह ** गंभीर रूप से ** पुरानी है (लगभग एक दशक पुराना)।मैं दृढ़ता से अनुशंसा करता हूं कि आपको काम करने के लिए एक बेहतर किताब मिल जाए। –

+0

@torazaburo लेकिन मैंने इसे विभिन्न स्रोतों से अनुशंसित पुस्तक के रूप में पढ़ने के बाद, इस पुस्तक को उठाया है। –

उत्तर

8

पहली कॉल में, this सरणी जिस पर unshift बुलाया गया था करने के लिए संदर्भित करता है, और इसलिए यह Array.prototype से splice इनहेरिट करती है।

दूसरी कॉल में, हालांकि, कोड slice कुछ है कि एक सरणी नहीं है पर उपयोग करता है (arguments छद्म सरणी है, जो एक slice विधि नहीं है)। तो उस मामले में, क्रॉकफोर्ड ने Array.prototype के माध्यम से विधि का उपयोग किया।

तकनीकी तौर पर, वह दूसरे स्थान में this.slice इस्तेमाल किया सकता है, इस तरह:

Array.method('unshift', function() { 
    this.splice.apply(this,[0,0].concat(this.slice.apply(arguments))); 
    return this; 
}); 

... लेकिन यह शायद के बाद से दूसरी कॉल संदर्भित वर्तमान सरणी के साथ कोई संबंध नहीं है भ्रामक हो गया होता, this द्वारा।

+0

@ राजत सक्सेना: मेरी खुशी। मैंने उपरोक्त कुछ भ्रामक हटा दिया है (कोड 'splice' और' slice' का उपयोग कर रहा है, लेकिन मेरे मूल उत्तर में, मैंने गलती से सोचा था कि यह दो बार 'splice'' का उपयोग करता है)। –

0

कभी कभी यह तो आप महसूस करते हैं कि कई मामलों में हम foo.bar === Foo.prototype.bar; // true

structure of prototypes

एक उदाहरण foo के निर्माण पर, निर्माता Foo के रूप में स्थापित हो जाता है की प्रोटोटाइप संपत्ति है संबंध कल्पना करने के लिए आसान है foo (__proto__) का एक विशेष संदर्भ, जहां आप ऐसी संपत्ति तक पहुंचने का प्रयास करते हैं जो सीधे foo पर मौजूद नहीं है, तो उस स्थान के बारे में उस स्थान के बारे में बताया जाता है।

इसका मतलब यह है जब आप उम्मीद कर foo एक तरह से जो उस वस्तु से एक संपत्ति को छुपाने होता है, यह वास्तव में कोई फर्क नहीं पड़ता कि आप foo.bar या Foo.prototype.bar के माध्यम से देखने के लिए के रूप में यह एक ही बात है की कोशिश में संशोधित किया गया है नहीं करने के लिए।

लेकिन, जैसा कि आप देख सकते हैं, नहीं सब कुछ ही __proto__ पथ है, तो आप obj.slice कल्पना नहीं कर सकता है मौजूद होगा, उदाहरण के लिए होगा। इसका मतलब यह है कि यदि आप एक सरणी उदाहरण नहीं है, लेकिन आप टुकड़ा करना चाहते हैं यह, आप, टुकड़ा संदर्भित करने के लिए हालांकि एक तरह से आप जानते हैं कि मौजूद है ऐसे Array.prototype.slice

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