यह वास्तव में निर्भर करता है कि आप क्लोन क्या करना चाहते हैं। क्या यह वास्तव में JSON वस्तु है या जावास्क्रिप्ट में कोई वस्तु है? यदि आप कोई क्लोन करना चाहते हैं, तो यह आपको कुछ परेशानी में डाल सकता है। कौन सी परेशानी? मैं इसे नीचे बताऊंगा, लेकिन सबसे पहले, एक कोड उदाहरण जो क्लोन करता है, जो वास्तव में ऑब्जेक्ट, किसी भी आदिम, सरणियों और DOM नोड्स है।
function clone(item) {
if (!item) { return item; } // null, undefined values check
var types = [ Number, String, Boolean ],
result;
// normalizing primitives if someone did new String('aaa'), or new Number('444');
types.forEach(function(type) {
if (item instanceof type) {
result = type( item );
}
});
if (typeof result == "undefined") {
if (Object.prototype.toString.call( item ) === "[object Array]") {
result = [];
item.forEach(function(child, index, array) {
result[index] = clone( child );
});
} else if (typeof item == "object") {
// testing that this is DOM
if (item.nodeType && typeof item.cloneNode == "function") {
result = item.cloneNode( true );
} else if (!item.prototype) { // check that this is a literal
if (item instanceof Date) {
result = new Date(item);
} else {
// it is an object literal
result = {};
for (var i in item) {
result[i] = clone( item[i] );
}
}
} else {
// depending what you would like here,
// just keep the reference, or create new object
if (false && item.constructor) {
// would not advice to do that, reason? Read below
result = new item.constructor();
} else {
result = item;
}
}
} else {
result = item;
}
}
return result;
}
var copy = clone({
one : {
'one-one' : new String("hello"),
'one-two' : [
"one", "two", true, "four"
]
},
two : document.createElement("div"),
three : [
{
name : "three-one",
number : new Number("100"),
obj : new function() {
this.name = "Object test";
}
}
]
})
और अब, हम उन समस्याओं के बारे में बात करते हैं जो आपको वास्तविक वस्तुओं की क्लोनिंग करते समय मिल सकती हैं। मैं अब बात कर रहा हूँ, उन वस्तुओं के बारे में जो आप कुछ ऐसा करके बनाते हैं
var User = function(){}
var newuser = new User();
बेशक आप उन्हें क्लोन कर सकते हैं, यह कोई समस्या नहीं है, प्रत्येक ऑब्जेक्ट कंस्ट्रक्टर संपत्ति को उजागर करता है, और आप इसका उपयोग ऑब्जेक्ट क्लोन करने के लिए कर सकते हैं, लेकिन यह हमेशा काम नहीं करेगा। आप for inइस ऑब्जेक्ट पर सरल भी कर सकते हैं , लेकिन यह उसी दिशा में जाता है - परेशानी। मैंने कोड के अंदर क्लोन कार्यक्षमता को भी शामिल किया है, लेकिन इसे if( false )बयान से बाहर रखा गया है।
तो, क्लोनिंग एक दर्द क्यों हो सकता है? खैर, सबसे पहले, प्रत्येक वस्तु / उदाहरण में कुछ अवस्था हो सकती है। आप कभी भी यह सुनिश्चित नहीं कर सकते हैं कि आपकी वस्तुओं में उदाहरण के लिए एक निजी चर नहीं है, और यदि ऐसा है, तो ऑब्जेक्ट को क्लोन करके, आप बस राज्य को तोड़ देते हैं।
कल्पना कीजिए कि कोई राज्य नहीं है, यह ठीक है। फिर भी हमें एक और समस्या है। "कंस्ट्रक्टर" विधि के माध्यम से क्लोनिंग हमें एक और बाधा देगा। यह एक तर्क पर निर्भरता है। आप कभी भी निश्चित नहीं हो सकते हैं कि किसी ने इस वस्तु को बनाया है, नहीं किया है, किसी तरह का
new User({
bike : someBikeInstance
});
यदि यह मामला है, तो आप भाग्य से बाहर हैं, someBikeInstance शायद किसी संदर्भ में बनाया गया था और यह संदर्भ क्लोन विधि के लिए अनकॉन्स्ड है।
इसलिए क्या करना है? आप अभी भी for inसमाधान कर सकते हैं, और ऐसी वस्तुओं का इलाज कर सकते हैं जैसे सामान्य वस्तु शाब्दिक, लेकिन शायद यह एक विचार है कि ऐसी वस्तुओं का क्लोन बिल्कुल भी नहीं है, और बस इस वस्तु के संदर्भ को पारित करें?
एक अन्य समाधान है - आप एक कन्वेंशन सेट कर सकते हैं कि जिन सभी वस्तुओं को क्लोन किया जाना चाहिए वे इस भाग को स्वयं लागू करें और उपयुक्त एपीआई विधि (जैसे क्लोनऑब्जेक्ट) प्रदान करें। cloneNodeडोम के लिए कुछ कर रहा है।
आप तय करें।