আপনি কী ক্লোন করতে চান তা এটি নির্ভর করে। এটি কি সত্যিই JSON অবজেক্ট বা জাভাস্ক্রিপ্টে কেবল কোনও অবজেক্ট? আপনি যদি কোনও ক্লোন করতে চান তবে এটি আপনাকে কোনও সমস্যার মধ্যে ফেলতে পারে। কোন ঝামেলা? আমি এটি নীচে ব্যাখ্যা করব, তবে প্রথমে একটি কোড উদাহরণ যা ক্লোরনকে আক্ষরিক, কোনও আদিম, অ্যারে এবং ডিওএম নোডের অবজেক্ট করে।
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";
}
}
]
})
এবং এখন, আসল বিষয়গুলির ক্লোনিং শুরু করার সময় আপনি যে সমস্যার মুখোমুখি হতে পারেন সে সম্পর্কে কথা বলি। আমি এখন কথা বলছি, আপনি এমন কিছু করে তৈরি করা জিনিসগুলির বিষয়ে about
var User = function(){}
var newuser = new User();
অবশ্যই আপনি এগুলি ক্লোন করতে পারেন, এটি কোনও সমস্যা নয়, প্রতিটি বস্তু নির্মাণকারীর সম্পত্তি প্রকাশ করে এবং আপনি এটি বস্তুর ক্লোন করতে ব্যবহার করতে পারেন, তবে এটি সর্বদা কার্যকর হবে না। আপনি for inএই বস্তুগুলিতে সহজ কাজ করতে পারেন , তবে এটি একই দিক - সমস্যাতে চলে যায়। আমি কোডের ভিতরে ক্লোন কার্যকারিতাও অন্তর্ভুক্ত করেছি, তবে if( false )বিবৃতি দিয়ে এটি বাদ দেওয়া হয়েছে।
সুতরাং, ক্লোনিং একটি ব্যথা হতে পারে কেন? ওয়েল, প্রথমত, প্রতিটি বস্তুর / দৃষ্টান্তের কিছুটা অবস্থা থাকতে পারে। আপনি কখনই নিশ্চিত হতে পারবেন না যে আপনার বস্তুর উদাহরণস্বরূপ একটি ব্যক্তিগত ভেরিয়েবল নেই, এবং যদি এটি হয় তবে ক্লোনিং অবজেক্ট দ্বারা, আপনি কেবল রাষ্ট্রটি ভেঙে দিন।
ভাবুন তো কোনও রাজ্য নেই, তা ঠিক আছে। তারপরে আমাদের আরও একটি সমস্যা রয়েছে। "কনস্ট্রাক্টর" পদ্ধতির মাধ্যমে ক্লোনিং আমাদের আরও একটি বাধা দেয়। এটি একটি যুক্তি নির্ভরতা। আপনি কখনই নিশ্চিত হতে পারবেন না যে যে কেউ এই বস্তুটি তৈরি করেছেন, করেননি, কোনও প্রকারের
new User({
bike : someBikeInstance
});
যদি এটি হয় তবে আপনার ভাগ্যের বাইরে, কিছু বাইকইনস্ট্যান্স সম্ভবত কোনও প্রসঙ্গে তৈরি হয়েছিল এবং সেই প্রসঙ্গটি ক্লোন পদ্ধতির জন্য অজানা।
তো এখন কি করা? আপনি এখনও for inসমাধান করতে পারেন , এবং এই জাতীয় অবজেক্টগুলিকে সাধারণ অবজেক্ট ল্যাটারালগুলির মতো চিকিত্সা করতে পারেন , তবে সম্ভবত এই জাতীয় বস্তুটি মোটেও ক্লোন না করা এবং কেবল এই অবজেক্টের রেফারেন্সটি পাস করা কোনও ধারণা?
আর একটি সমাধান হ'ল - আপনি একটি কনভেনশন সেট করতে পারেন যে ক্লোন করা আবশ্যক এমন সমস্ত বস্তুর নিজেরাই এই অংশটি প্রয়োগ করতে হবে এবং যথাযথ এপিআই পদ্ধতি সরবরাহ করতে হবে (ক্লোনঅবজেক্টের মতো)। কিছু কি cloneNodeকরে DOM জন্য করছে।
তুমি ঠিক কর.