لا أعرف متى بدأت ، ولكن ظهرت كلمة جديدة في الدائرة الأمامية: استنساخ عمق الكائن. يبدو طويلًا جدًا ، لكنه ليس جديدًا في الواقع. ربما تكون قد استخدمتها في تطوير المشروع الفعلي ، ولكن بسبب عمق الشخصيات الصينية ، تصبح بعض الأشياء البسيطة في الأصل غامضة من خلال تعديلها قليلاً من قبل بعض المفردات المحترفة على ما يبدو.
بادئ ذي بدء ، لماذا تحتاج إلى استنساخ عميق كائن؟ واسمحوا لي أن أخمن: أنت تعتقد أحيانًا أن مستند الكائن المدمج لـ JS طويل جدًا ، ثم يمكنك القيام بذلك:
نسخة الكود كما يلي:
var d = document ؛
d.by = function (id) {
إرجاع d.getElementById (id) ؛
} ؛
d.by ('id'). innerhtml = 'hello sentsin' ؛
يقوم الرمز أعلاه بتبسيط المستند. يمكنك التحقق من حكمك من خلال قيمة الحالة التي تم إرجاعها بواسطة المستند. hasownproperty ('by'). دعونا نلقي نظرة على المثال التالي.
نسخة الكود كما يلي:
var person = {name: 'xianxin' ، المهنة: "التنمية الأمامية" ، المكان: "Hangzhou"} ؛
var newperson = شخص ؛
newPerson.age = '24' ؛
console.log (شخص) ؛
// النتيجة: {name: 'xianxin' ، المهنة: "التنمية الأمامية" ، المكان: "Hangzhou" ، العمر: 24}
يمكن ملاحظة أنه عندما يتم تمرير كائن ما إلى متغير جديد ، فهو مجرد اسم مستعار للكائن. هذا يعني أن قيمة مفتاح الكائن الأصلية ستتغير من خلال العملية على الاسم المستعار. لكن المشكلة هي أننا في بعض الأحيان نريد أن يكون NewPerson مستقلاً تمامًا عن الشخص ولا توجد علاقة تزامن بين بعضنا البعض ، لذلك نحن بحاجة إلى إنشاء نسخة ، يرجى الاطلاع على المثال:
نسخة الكود كما يلي:
var cloneobj = function (obj) {
var str ، newObj = obj.constructor === Array؟ []: {} ؛
if (typeof obj! == 'Object') {
يعود؛
} آخر إذا (window.json) {
str = json.stringify (obj) ، // كائن تسلسلي
newObj = json.parse (str) ؛ //يعيد
} آخر {
لـ (var i in obj) {
newObj [i] = typeof obj [i] === 'Object'؟
cloneobj (obj [i]): obj [i] ؛
}
}
إرجاع NewObj ؛
} ؛
//امتحان
var obj = {a: 0 ، b: 1 ، c: 2} ؛
var arr = [0 ، 1 ، 2] ؛
// تنفيذ الاستنساخ العميق
var newObj = cloneObj (OBJ) ؛
var newarr = cloneobj (arr) ؛
// قم بإزالة حذف العضو الكائن الجديد المستنسخ
Delete NewObj.A ؛
Newarr.Splice (0،1) ؛
Console.log (OBJ ، ARR ، Newobj ، Newarr) ؛
// النتيجة: {a: 0 ، b: 1 ، c: 2} ، [0 ، 1 ، 2] ، {b: 1 ، c: 2} ، [1 ، 2] ؛
هذا هو ما يسمى الكائن استنساخ. ولكن هناك بعض الأشياء التي يجب شرحها. ينتمي كائن JSON وأساليب الأعضاء الخاصة به وتوصيله في الكود إلى مواصفات ECMASCRIPT5. إنهم مسؤولون عن تحويل كائن (بما في ذلك كائنات الصفيف) إلى سلاسل واستعادتها ، وبالتالي تحقيق نسخ عميق للكائن. لذلك بالنسبة للمتصفحات ذات المستوى المنخفض (مثل IE) ، إذا قمت بنسخ المصفوفات ، فيمكنك استخدام NewObj.concat (OBJ) ، ويمكن للكائنات العادية ببساطة تعداد القيم وتعيينها.