2012-12-20 3 views
6

यह My Old Questionमैंने किसी चीज़ की कॉपी संरक्षित कर सकते हैं, उस वस्तु के अंदर जब इसकी बनाया - लगातर:

की निरंतरता है यह मेरा समारोह है जो एक नए छात्र वस्तु बनाता है:

function student(id, name, marks, mob, home){ 
    this.id = id; 
    this.name = name; 
    this.marks = marks; 
    this.contacts = {}; 
    this.contacts.mob = mob; 
    this.contacts.home = home; 

    this.toContactDetailsString = function(){ 
     return this.name +':'+ this.mob +', '+ this.home 
    } 
} 

मैं वस्तु की एक प्रति बनाना चाहेंगे, जब यह है कि वस्तु के अंदर आरंभ नहीं हो जाता: मैं इस के साथ आया था:

function student(id, name, marks, mob, home){ 
    this.id = id; 
    this.name = name; 
    this.marks = marks; 
    this.contacts = {}; 
    this.contacts.mob = mob; 
    this.contacts.home = home; 

    this.toContactDetailsString = function(){ 
     return this.name +':'+ this.mob +', '+ this.home 
    } 
    this.baseCopy = this; //Not sure about this part 
} 

लेकिन समस्या यह है कि मुझे बेसकॉपी में वर्तमान ऑब्जेक्ट की प्रतियों की अनंत लूप दे रही है; एएनडी भी जब भी मैं अपने ऑब्जेक्ट के किसी भी गुण को अद्यतन करता हूं तो यह स्वचालित रूप से अपडेट हो रहा है।

1. यह कैसे संभव है कि, मैं उस ऑब्जेक्ट के प्रारंभिक मानों के साथ किसी ऑब्जेक्ट की प्रतिलिपि को संरक्षित कर सकता हूं जब इसे बनाया गया हो?

2. यह संभव शुद्ध जे एस

+0

आप ऑब्जेक्ट की एक प्रति "बेसकॉपी" पर निर्दिष्ट नहीं करते हैं लेकिन एक संदर्भ। कोई प्रतिलिपि नहीं की जाती है, यही कारण है कि "बेसकॉपी" हमेशा "अद्यतित" होती है। एक वास्तविक प्रति प्राप्त करने के बारे में एक विचार प्राप्त करने के लिए, http://api.jquery.com/jQuery.extend/ पर एक नज़र डालें। – Niko

+0

'यह' इस संदर्भ में 'विंडो' ऑब्जेक्ट का जिक्र कर रहा है। – Stefan

+0

तो, क्या आपके किसी भी उत्तर ने आपके लिए काम पोस्ट किया है? – Cerbrus

उत्तर

3

सुंदर ज्यादा की तरह अपने पिछले प्रश्न पर मेरा उत्तर है, तो आप वस्तु की एक प्रतिलिपि बनाने के लिए इस कोड का उपयोग कर सकते हैं और यह नेस्ट है गुण है, जबकि नहीं कॉपी-इंग यह कार्यों है:

function student(id, name, marks, mob, home){ 
    this.id = id; 
    this.name = name; 
    this.marks = marks; 
    this.contacts = {}; 
    this.contacts.mob = mob; 
    this.contacts.home = home; 

    this.toContactDetailsString = function(){ 
     return this.name +':'+ this.mob +', '+ this.home 
    } 

    // Copy the object to baseCopy 
    this.baseCopy = clone(this); // "clone" `this.baseCopy` 
} 

function clone(obj){ 
    if(obj == null || typeof(obj) != 'object'){ // If the current parameter is not a object (So has no properties), return it; 
     return obj; 
    } 

    var temp = {}; 
    for(var key in obj){ // Loop through all properties on a object 
     if(obj.hasOwnProperty(key) && !(obj[key] instanceof Function)){ // Object.prototype fallback. Also, don't copy the property if it's a function. 
      temp[key] = clone(obj[key]); 
     } 
    } 
    return temp; 
} 

var s = new student(1, 'Jack', [5,7], 1234567890, 0987654321); 
s.marks = s.marks.concat([6,8]); // Jack's gotten 2 new marks. 

console.log(s.name + "'s marks were: ", s.baseCopy.marks); 
// Jack's marks were: [5, 7] 
console.log(s.name + "'s marks are: ", s.marks); 
// Jack's marks are: [5, 7, 6, 8] 
console.log(s.baseCopy.toContactDetailsString); // check if the function was copied. 
// undefined 
console.log(s.baseCopy.contacts.mob); 
// 1234567890 

(मैं ' एक सेकंड के लिए गहरी प्रतिलिपि पर काम करेंगे)

"गहरी" प्रतिलिपि अब काम करनी चाहिए।

3
का उपयोग कर कार्यों

3. मैं बहुत पता करने के लिए अगर यह हार्ड-कोड विशेषता नाम के बिना संभव है उत्सुक हूँ कॉपी और से करने के लिए नहीं है

आप

this.baseCopy = this; कहकर एक प्रतिलिपि नहीं बना रहे हैं, तो आप बस इस आंतरिक चर के संदर्भ को सेट कर रहे हैं। तो baseCopy भी एक ही वस्तु

आप एक तरीका है जिसके पारित कर छात्र वस्तु से एक नया छात्र वस्तु वापस आ जाएगी और उसके बाद की दुकान है कि BaseCopy

रूप
1
this.baseCopy = new student(id, name, marks); 

आपका रास्ता सिर्फ एक परिपत्र संदर्भ बनाता है बनाने की जरूरत की ओर इशारा करते है। एक नई वस्तु को तुरंत चालू करने के लिए new का उपयोग करें।

इसका उपयोग शायद असीमित रिकर्सन में जाएगा।

आप इस तरह इस दरकिनार कर सकते हैं:

function student(id, name, marks, flag) { 
    // usual code... 
    // And: 
    if (!flag) { 
     this.baseCopy = new student(id, name, marks, true); 
    } 
} 

इस तरह, केवल शीर्ष छात्र एक baseCopy है।

+0

यह शायद काम नहीं करेगा। जब आप एक ही इनपुट के साथ एक प्रतिलिपि बनाते हैं .. नई प्रतिलिपि शायद एक और प्रतिलिपि होगी ... जो अभी तक एक और प्रतिलिपि होगी। – user1600124

+0

@ user1600124 इसे ध्यान में रखने के लिए संपादित किया गया :) –

+0

इस तरह .. बेसकॉपी अभी भी छात्र का एक उदाहरण है, और इसमें – user1600124

1

खैर ...

this.baseCopy = this; 

मूल रूप से इसका मतलब है कि वस्तु के baseCopy वस्तु ही है। तो:

var abc = new student(someId, someName, someMarks); 

एबीसी और abc.baseCopy वास्तव में एक ही वस्तु को इंगित। आप क्या कर सकते शायद करने के लिए baseCopy बदल जाता है:

this.baseCopy = { id: id, name: name, marks: marks, contact: {mob:mob, home: home}} 

मूल रूप से मैन्युअल रूप से एक वस्तु में आदानों की एक प्रतिलिपि बनाने। ध्यान रखें कि यदि किसी भी इनपुट संदर्भ प्रकार हैं, तो प्रतिलिपि अभी भी उसी वस्तु को मूल के रूप में इंगित करेगी।

+0

आपको अभी भी विधियों की आवश्यकता है। –

+0

उसने पूछा कि क्या संभव है कि कार्यों को कॉपी न करें ... – user1600124

+0

ओह ठीक है। मेरी गलती :-) –

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

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