2011-11-16 14 views
11

यहां jQuery पर एक नया नोब हैलो और मैं सोच रहा था कि jQuery ऑब्जेक्ट्स अपरिवर्तनीय हैं या नहीं। उदाहरण के लिए:jQuery ऑब्जेक्ट अपरिवर्तनीय हैं?

var obj1 = $("<tag></tag>"); 
var obj2 = obj1.append("something"); 

obj1 करेंगे और हो obj2 एक ही अर्थ obj2 obj1 संदर्भ लेंगे?

अद्यतन:

खरोंच के ऊपर के उदाहरण तरह मैं क्या जानना चाहते हैं की सतह, एक और अधिक सटीक सवाल यह है: अगर मैं jQuery एपीआई से समारोह श्रृंखला वे एक ही वस्तु या एक नया वापस आ जाएगी (जावा में तार के साथ मामले के रूप में)?

+0

कई jQuery विधियां (नहीं .append) अपनी प्रकृति के कारण एक नई jQuery ऑब्जेक्ट लौटाती हैं, क्या आपको उन सभी विधियों या कुछ की एक संगत सूची की आवश्यकता है? इससे कोई फर्क नहीं पड़ता कि आप चेन कर रहे हैं, क्या मायने रखता है कि विधियां क्या लौटती हैं। '$ (" div ")। संलग्न करें (" कुछ ")। बाइंड (" क्लिक करें ", एफएन)' $ ("div") के दौरान एक ही ऑब्जेक्ट देता है। माता-पिता() '' (" div ")। html()' एक jQuery ऑब्जेक्ट को बिल्कुल वापस नहीं करता है लेकिन स्ट्रिंग – Esailija

+0

@Esailija मुझे एक सूची की आवश्यकता नहीं है, मैं बस सोच रहा था कि यदि आप चेन और एक नई वस्तु वापस आ जाएंगी तो यह एक होगा मेमोरी रिसाव – Daniel

+1

हां यह होगा, उदाहरण के लिए 'var a = $ ("div")। parent()' 2 ऑब्जेक्ट्स बनाएगा और ऐसा लगता है कि कुछ भी पहले ऑब्जेक्ट का जिक्र नहीं कर रहा है और यह कचरा इकट्ठा होगा, दूसरी ऑब्जेक्ट वास्तव में इसकी '.prevObject' प्रॉपर्टी में पहली वस्तु को संदर्भित करता है, इसलिए, इस स्थिति में, यदि आप कहीं भी' ए 'स्टोर करते हैं तो आप पहले ऑब्जेक्ट से कभी भी छुटकारा नहीं पाएंगे, भले ही आप केवल दूसरे का उपयोग कर रहे हों। – Esailija

उत्तर

1

http://jsfiddle.net/rLg9S/

दोनों वस्तु इतनी ही तत्व लौट हाँ।

+1

यह सवाल का जवाब नहीं देता है। – Tadeck

+1

'obj1' संशोधित नहीं है लेकिन अंतर्निहित डोम तत्व (' obj1 ["0"] ') है। – Esailija

3

हां, यह obj2obj1 का संदर्भ देगा। यह मूल रूप से क्या करता है append जो भी obj1 को दिया गया है और संदर्भ देता है।

आप console पर देखकर कि obj1 और obj2 पाठ "something"

console.log(obj1); 
console.log(obj2); 
6

दोनों obj1 और obj2 होने, <tag></tag> तत्व से युक्त jQuery ऑब्जेक्ट के संदर्भ हो जाएगा हाँ कोशिश कर सकते हैं।

आप दूसरा तत्व के लिए एक संदर्भ रखना चाहते हैं, तो आप .appendTo() बजाय इस्तेमाल कर सकते हैं:

var obj1 = $("<p>foo</p>"), 
    obj2 = $("<span>bar</span>").appendTo(obj1); 
3

मान लिया जाये कि मैं समझ लिया है अपने प्रश्न, हाँ, obj2 वस्तु obj1 में संग्रहीत करने के लिए एक संदर्भ होगा । आप obj2 के लिए कुछ करते हैं:

obj2.attr("id", "example"); 

आप obj1 में परिवर्तन देखेंगे:

console.log(obj1 == obj2) //true 
0

आप:

console.log(obj1) //Will show <tag id="example">something</tag> 

आप समानता के लिए दो वस्तुओं के परीक्षण से आगे इस बात की पुष्टि कर सकते हैं यदि आपको ऑब्जेक्ट की प्रतिलिपि की आवश्यकता है तो $.clone() का उपयोग कर सकते हैं।

var obj2 = obj1.clone().append("something"); 
0
var obj1 = $("<p></p>"); 
var obj2 = obj1.append("something"); // in this is you just assign the `obj1` object to `obj2` 

की तरह:

var x = 5; 
var y = x; //here, both x and y are 5 

तो, obj1 और obj2 एक ही बात का उल्लेख होगा

सबूत:

console.log(obj1 === obj2); 
1

तो एक समारोह परिवर्तन जो तत्व हैं एक चयन में, फिर हां, एक नई वस्तु बनाई जाएगी।

उदाहरण के लिए:

var link = $('#myLink'), 
    span = link.find('span'); 

linkspan के लिए एक अलग वस्तु है। हालांकि, मूल वस्तु वास्तव में खो नहीं है। आप end विधि के साथ बहुत आसानी से वापस जा सकते हैं, जो मूल रूप से एक हेरफेर ऑपरेशन वापस रोल करता है।

$('#myLink') 
    .find('span') // get the span elements 
     .css('color', '#fff') // modify them 
    .end() // go back to the original selection 
    .css('font-size', '24px'); // modify that 

तो अगर आप श्रृंखलित चयन कॉल की एक बहुत बड़ी संख्या है कि end का उपयोग नहीं किया था, तो आप एक बहुत बड़ी वस्तु लग सकती है (क्योंकि उस उद्देश्य यह है कि बनाया संदर्भित वस्तुओं की एक श्रृंखला होगी उन्हें)। हालांकि, यह अविश्वसनीय रूप से अजीब डिजाइन होगा, इसलिए, ऐसा नहीं है कि आप ऐसा कर रहे हैं, जबकि जावास्क्रिप्ट के कचरे के संग्रह का मतलब आम तौर पर होना चाहिए कि जिन वस्तुओं के साथ आप समाप्त कर चुके हैं वे स्मृति में चारों ओर लटका नहीं देते हैं।

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