2012-05-08 30 views
9

मैंने हर जगह खोज की है और ऐसे उत्तरों के साथ समान प्रश्न पाए हैं जो वास्तव में मेरे मुद्दे को संबोधित नहीं करते हैं, इसलिए अगर मैं दोहराना पसंद करता हूं तो मैं क्षमा चाहता हूं, लेकिन यह मेरे प्रयोग से दिखाई देता है कि jQuery की गहरी प्रतिलिपि फ़ंक्शन वास्तव में वर्णित नहीं है (या शायद मैं इसके विवरण को गलत पढ़ रहा हूं)। http://jsfiddle.net/wcYsH/jQuery गहरी प्रतिलिपि क्यों बढ़ाता है किसी वस्तु को दोबारा कॉपी नहीं करता है?

या इस डाउनलोड के लिए: जब गहरी प्रतिलिपि छेड़छाड़ https://github.com/kevroy314/jQuery-Extend-Test

क्यों पिछली प्रति में डेटा बदल जाओ करता

यहाँ एक उदाहरण समस्या मैं आ रही हैं प्रदर्शन है?

+1

क्या आप इसके बजाय 'jQuery'' 'clone' का उपयोग करना चाहते हैं? –

+1

इसके बारे में jQuery फ़ोरम पर एक धागा था हाल ही में। मुझे लगता है कि आपका उपयोगकेस $ के उद्देश्य से बाहर आता है। मुझे आगे बढ़ाएं Thod। https://forum.jquery.com/topic/deep-copies-using-extend-on-object-instances –

+1

यहां एक संबंधित बग टिकट है http://bugs.jquery.com/ticket/10014 –

उत्तर

5

एक के लिए, आप सामान्य वस्तुओं को नहीं बना रहे हैं।

मैं विस्तार के लिए jQuery 1.7.2 के लिए स्रोत कोड देख रहा हूं।

https://github.com/jquery/jquery/blob/master/src/core.js

और मैं लाइन देख रहा हूँ:

if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) 

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

लेकिन आप "सादा" वस्तुएं नहीं बना रहे हैं। आप नए ऑपरेटर के साथ एक कन्स्ट्रक्टर का आह्वान करके उत्पन्न वस्तुओं को बना रहे हैं।

अब, isPlainObject में, ऐसा लगता है कि इन पंक्तियों का मूल्यांकन किया जाना चाहिए। (जहां hasOwn hasOwn = Object.prototype.hasOwnProperty

try { 
     // Not own constructor property must be Object 
     if (obj.constructor && 
      !hasOwn.call(obj, "constructor") && 
      !hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) { 
      return false; 
     } 
    } catch (e) { 
     // IE8,9 Will throw exceptions on certain host objects #9897 
     return false; 
    } 

है और वहाँ है, जहां उसे यह एक "plainObject" नहीं है।

यह समझ में आता है जब आप एक निर्माता के साथ वस्तुओं पर विचार शायद उस निर्माता के माध्यम से या पर बनाया जाना चाहिए कम से कम "क्लोन" विधि का उपयोग करें जैसा कि आप अन्य भाषाओं/ढांचे में देखेंगे।

+1

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