52

मैं हाल ही में इस तरह एक वस्तु बनाने की कोशिश की:क्या जावास्क्रिप्ट ऑब्जेक्ट प्रॉपर्टी एक ही ऑब्जेक्ट की दूसरी प्रॉपर्टी का संदर्भ दे सकती है?

var carousel = { 
     $slider: $('#carousel1 .slider'), 
     panes: carousel.$slider.children().length 
    }; 

मेरे इरादों एक वस्तु संपत्ति में $('#carousel1 .slider') के परिणाम कैशिंग द्वारा jQuery के चयनकर्ता प्रदर्शन में सुधार करने, और कोड संक्षिप्त और अपेक्षाकृत सूखा रखने के लिए थे।

हालांकि, यह काम नहीं किया। जब कोड निष्पादित किया गया, तो panes के मान को पार्स करने का प्रयास करते समय यह अपवाद फेंक दिया, शिकायत करते हुए कि carousel अनिर्धारित था।

यह समझ में आता है, क्योंकि मुझे लगता है कि carousel पूरी तरह से घोषित नहीं किया गया है जब तक कि असाइनमेंट कथन पूरी तरह से निष्पादित नहीं किया जाता है। यही कारण है कि बहुत ज्यादा बदतर नहीं है

var carousel = {}; 
carousel.$slider = $('#carousel1 .slider'); 
carousel.panes = carousel.$slider.children().length; 

, लेकिन carousel वस्तु, कई और अधिक गुण है कि अन्य संपत्तियों के मूल्यों पर भरोसा करना होगा, ताकि जल्दी से वर्बोज़ बन सकता है: हालांकि, मैं इस का सहारा से बचने के लिए चाहते हैं।

मैंने this का उपयोग करने का प्रयास किया, लेकिन इसका कोई फायदा नहीं हुआ। मैं शायद इसे सही तरीके से उपयोग नहीं कर रहा हूं, या हो सकता है कि यह वैसे भी एक वैध दृष्टिकोण न हो।

क्या ऑब्जेक्ट के गुणों के लिए एक ही ऑब्जेक्ट के अन्य गुणों को संदर्भित करने का कोई तरीका है, जबकि उस ऑब्जेक्ट को अभी भी घोषित किया जा रहा है? (! धन्यवाद, दोस्तों)


मैथ्यू Flaschen और कैसाब्लांका के जवाब के आधार पर, मुझे लगता है कि इन कि मैं पहुंचते हैं अपने वास्तविक कोड के संस्करणों, प्रत्येक दृष्टिकोण के आधार पर कर रहे हैं:

// Matthew Flaschen 

var carousel = new (function() { 
    this.$carousel = $('.carousel'); 
    this.$carousel_window = this.$carousel.find('.window'); 
    this.$carousel_slider = this.$carousel.find('.slider'); 
    this.$first_pane = this.$carousel.find('.slider').children(':first-child'); 
    this.panes = this.$carousel_slider.children().length; 
    this.pane_gap = this.$first_pane.css('margin-right'); 
})(); 

और

// casablanca 

var $carousel = $('.carousel'), 
    $carousel_slider = $carousel.find('.slider'), 
    $first_pane: $carousel.find('.slider').children(':first-child'); 

var properties = { 
    $carousel_window: $carousel.find('.window'), 
    panes: $carousel_slider.children().length, 
    pane_gap: $first_pane.css('margin-right') 
}; 

properties.$carousel = $carousel; 
properties.$carousel_slider = $carousel_slider; 
properties.$first_pane = $first_pane; 

मान लिया जाये कि उन दोनों सही हैं (मैं उन्हें परीक्षण नहीं किया है), यह एक कठिन कॉल की तरह है। मुझे लगता है कि मैं मैथ्यू फ्लैंचन के दृष्टिकोण को थोड़ा पसंद करता हूं, क्योंकि कोड एक संरचना में निहित है जो ऑब्जेक्ट घोषणा के करीब दिखता है। आखिरकार केवल एक चर बनाया गया है। हालांकि, वहां बहुत सारे this हैं, जो दोहराए जाने लगते हैं - हालांकि यह केवल भुगतान करने की कीमत हो सकती है।

+1

ओपी: डुप्लिकेट जरूरी कालक्रम के अनुसार निर्धारित नहीं किया गया है। लक्ष्य को * कैननिकल * प्रश्न को इंगित करने के लिए लक्ष्य के साथ, हम अधिक विस्तृत और व्यापक उत्तरों के साथ सबकुछ वापस प्रश्नों को इंगित करने का प्रयास करते हैं। हालांकि, यह एक आसान लक्ष्य नहीं है। इस तरह के प्रश्न को डुप्लिकेट के रूप में चिह्नित करना इसके खिलाफ कोई निशान नहीं है। आपका प्रश्न विभिन्न शर्तों के साथ खोज इंजन पर आएगा, और यदि ये उत्तर समाधान हल नहीं करते हैं, तो दूसरा (अधिक व्यापक) प्रश्न हो सकता है। – CodeMouse92

+0

केस-इन-पॉइंट, मैंने लिखा है कि अब एक कैनोलिक सवाल माना जाता है, और कई पुराने, संकुचित-फोकस प्रश्नों को साइट के विज़िटर को सबसे पूर्ण उत्तरों की ओर फेंकने के लिए डुप्लिकेट के रूप में चिह्नित किया जा रहा है। गर्व करें - आपका "डुप्लिकेट" प्रश्न मदद कर रहा है। :) – CodeMouse92

+0

@ जेसनएमसी 9 2 को स्पष्टीकरण के लिए धन्यवाद, जो समझ में आता है। मेरा अपडेट हटा देगा। – Bungle

उत्तर

42

ऑब्जेक्ट लिटरल्स के साथ नहीं (this के पास शाब्दिक रूप से किए गए शाब्दिक निर्माण के दौरान समान मूल्य है)। लेकिन आप

var carousel = new (function() 
{ 
     this.$slider = $('#carousel1 .slider'); 
     this.panes = this.$slider.children().length; 
})(); 

यह किसी अज्ञात फ़ंक्शन कन्स्ट्रक्टर से बनाए गए ऑब्जेक्ट का उपयोग करता है।

ध्यान दें कि $slider और panes सार्वजनिक होते हैं, इसलिए carousel.$slider के रूप में पहुँचा जा सकता है, आदि

+0

यह ओपी के दूसरे उदाहरण का अनिवार्य रूप से एक अधिक वर्बोज़ संस्करण है। – casablanca

+1

@ कैसाब्लांका, वास्तव में नहीं। उन्होंने पूछा, "क्या ऑब्जेक्ट के गुणों के लिए एक ही ऑब्जेक्ट के अन्य गुणों को संदर्भित करने का कोई तरीका है, जबकि उस ऑब्जेक्ट को अभी भी घोषित किया जा रहा है?", और यही वही है। मेरे उदाहरण के साथ, 'कैरोसेल' पहले परिभाषित गुणों का उपयोग कर सकता है, लेकिन यह पूरी तरह से निर्मित होने तक बाहर से उपलब्ध नहीं है। अपने कोड के साथ, यह मामला नहीं था। और यह * 'कैरोसेल 'दोहराने के बजाए' इस 'का उपयोग करता है (जिसे ओपी ने कहा था)। उन्होंने कहा कि वह और अधिक संपत्तियों को जोड़ने की योजना बना रहे थे, जो इस दृष्टिकोण को भी कम कर सकते थे। –

+1

मुझे लगता है कि आप इसके बारे में सही हैं। – casablanca

17

दुर्भाग्य से, नहीं। {} वाक्यविन्यास एक नई वस्तु का निर्माण शुरू करता है, लेकिन जब तक वस्तु उत्पन्न नहीं होती है, तो इसे carousel चर निर्दिष्ट नहीं किया जाता है। इसके अलावा, this मान फ़ंक्शन कॉल के परिणामस्वरूप ही बदल सकता है।अपने "कई और गुण" सभी केवल slider पर निर्भर करने के लिए जा रहे हैं, तो आप कुछ इस तरह के साथ चारों ओर हो सकता है:

var slider = $('.slider'); 
var carousel = { 
    panes: slider.children.length(), 
    something: slider.something_else, 
    // ... 
}; 
carousel.slider = slider; 
+0

धन्यवाद, कैसाब्लांका! मैं उन मामलों के लिए आपके दृष्टिकोण की तरह करता हूं जब अधिकांश ऑब्जेक्ट गुण केवल एक या दो अन्य चर पर भरोसा करते हैं। दुर्भाग्यवश, मेरे उपयोग के मामले में, यह मामला नहीं है, इसलिए मुझे लगता है कि मैथ्यू फ्लैंचन का दृष्टिकोण थोड़ा और अधिक सुरुचिपूर्ण हो रहा है। एक बार फिर धन्यवाद। – Bungle