2013-03-13 9 views
6

कहो मैं निम्नलिखित कोड है पुनर्परिभाषित:सरणी निर्माता जावास्क्रिप्ट में

var secrets; 
Array = function() { 
    secrets = this; 
}; 

उपर्युक्त नमूने के लेखक का कहना है कि कोड सरणी निर्माता को पुनर्परिभाषित कर रहा है। सबसे पहले, मुझे यकीन नहीं है कि this क्या है। क्या कोई सलाह दे सकता है?

दूसरा: क्या निम्न कोड समकक्ष होगा?

var secrets; 
function Array() { 
    secrets = this; 
} 

तरह से ऊपर कोड एक JSON जोखिम के बारे में निम्न आलेख से लिया जाता है द्वारा: see here

+3

: तो वैश्विक वस्तु जो ब्राउज़र में window है जब तक आप new साथ दृष्टांत या का उपयोग call या apply

दोनों नमूनों के बीच का अंतर एक समारोह अभिव्यक्ति और समारोह घोषणा के बीच का अंतर है this अंक, देखना यहां दो प्रश्न पूछ रहे हैं। यह कैसे काम करता है [एमडीएन दस्तावेज में] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/this) (संक्षेप में: मान इस बात पर निर्भर करता है कि फ़ंक्शन कैसे है कहा जाता है) और क्या 'ऐरे = फ़ंक्शन() ...' या 'फ़ंक्शन ऐरे() ...' वही उत्तर दिया गया है [इस प्रश्न में] (http://stackoverflow.com/q/336859/218196)। –

+0

धन्यवाद फेलिक्स। इस 'के बारे में मैंने दस्तावेज पढ़ा है लेकिन उपर्युक्त संदर्भ ** में यह' क्या संदर्भित करता है ** को समझने में सक्षम नहीं था ** ... क्या आप या कुछ कृपया मदद कर सकते हैं ?? मेरे प्रश्न के दूसरे भाग के बारे में, मैंने आपके द्वारा प्रदान की गई पोस्ट पढ़ी है और अब मैं बेहतर समझता हूं। – balteo

+1

यदि आप 'नया 'के साथ' ऐरे 'को कॉल करते हैं, तो यह' Array.prototype' से प्राप्त एक खाली ऑब्जेक्ट को संदर्भित करेगा। यदि इसे 'नया' के बिना बुलाया जाता है, तो यह 'विंडो'' का संदर्भ देगा। यदि इसे '.call' या' .apply' के माध्यम से बुलाया जाता है, तो यह उस तत्व को संदर्भित करेगा जो पहले तर्क के रूप में पारित किया गया है। यह जानने के लिए कि इसे कैसे कहा जाता है, आपको 'JSON.parse' पर एक नज़र रखना होगा। –

उत्तर

5

दोनों उदाहरणों में आप चर Array तय कर रहे हैं एक function कि secrets को this प्रदान करती हो। ऐसा ही होता है कि Array नामक एक वैश्विक वस्तु पहले से मौजूद है कि पृष्ठ में अन्य जेएस एरे बनाने के लिए Constructor के रूप में उपयोग नहीं कर सकता है या नहीं। यदि आप अपने कंसोल में पॉप करते हैं और कुछ और होने के लिए ऐरे को फिर से असाइन करते हैं, तो आपको कोड से त्रुटियां मिलना शुरू हो सकता है जो स्पष्ट रूप से Array पर निर्भर करता है। हालांकि, [] के साथ शाब्दिक रूप से बनाए गए सरणी ठीक काम करते रहते हैं, और वास्तव में, उनके __proto__ अभी भी Array.prototype पर इंगित करते हैं। तो:

var arr1 = new Array('a','b','c'); 
// arr[0] -> 'a' 

var arr2 = ['d','e','f']; 
// arr[0] -> 'd' 

var secrets; 
Array = function() { secrets = this; }; 

var arr3 = new Array('g','h','i'); // nothing wrong here, because Array is a function 
// arr3[0] -> undefined 
// Array is just a function, you can't make arrays with new Array anymore 
// and arr3 is just a function 


var arr4 = ['j','k','l']; 
// arr4[0] -> 'j' 
// making array literals still works 

this, अजीब कुछ नहीं के लिए के रूप में, अभी भी this के नियमों का पालन करती। तथ्य यह है कि आप Array पर फ़ंक्शन असाइन कर रहे हैं, यह नहीं बदलता कि this व्यवहार कैसे करता है। आप What is the difference between a function expression vs declaration in Javascript?

1

हाँ, दोनों के टुकड़े के बराबर हैं। दोनों लिंक किए गए आलेख में बताए गए अनुसार, वेबसाइट द्वारा उपयोग किए जाने वाले सभी सरणी डेटा को अवरुद्ध करने के प्रयास में, सरणी कन्स्ट्रक्टर को फिर से परिभाषित करें। this का मान नव निर्मित सरणी माना जाता है।

ऐसा लगता है कि यह ईसीएमएस्क्रिप्ट 3 द्वारा अनुमत है, लेकिन अब सभी आधुनिक ब्राउज़रों पर उपलब्ध ईसीएमएस्क्रिप्ट 5 द्वारा अस्वीकृत है। तो लेख में वर्णित शोषण अब काम नहीं करना चाहिए।

+0

शोषण अभी और काम नहीं करता है क्योंकि मानक-अनुरूप JSON.parse या literal 'ऐरे' को कॉल नहीं करते हैं। Http://stackoverflow.com/q/13040367/1048572 – Bergi

+0

पर मेरा उत्तर देखें हां, यही मेरा मतलब है। पहले कुछ 'eval (' [1,2,3] ') की तरह कुछ' परिभाषित कन्स्ट्रक्टर को कॉल करेगा। – bfavaretto

+0

लेकिन यह अभी भी 'नए ऐरे() ' – C5H8NNaO4

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