ใน JavaScript การกำหนดทั้งหมดระหว่างตัวแปรวัตถุจะถูกส่งผ่านที่อยู่ นักเรียนบางคนอาจถามวัตถุวัตถุใด มันอาจจะดีกว่าที่จะยกตัวอย่าง:
การคัดลอกรหัสมีดังนี้:
typeof (true) // "boolean"
typeof (1) // "หมายเลข"
typeof ("1") // "สตริง"
typeof ({}) // "วัตถุ"
typeof ([]) // "วัตถุ"
typeof (null) // "วัตถุ"
typeof (function () {}) // "ฟังก์ชั่น"
ดังนั้นในความเป็นจริงวัตถุที่เราต้องจัดการกับการคัดลอกเชิงลึกคือวัตถุวัตถุและวัตถุที่ไม่ใช่วัตถุจะถูกกำหนดเพียงโดยตรงและตามปกติ ความคิดของฉันในการใช้การจำลองแบบลึกของ JS คือ:
วนซ้ำคุณสมบัติทั้งหมดของวัตถุนี้
หากคุณสมบัติคือ "วัตถุ" จำเป็นต้องมีการประมวลผลพิเศษ
หากวัตถุวัตถุนี้มีความพิเศษและเป็นอาร์เรย์ให้สร้างอาร์เรย์ใหม่และคัดลอกองค์ประกอบอย่างลึกซึ้งในอาร์เรย์
หากวัตถุนี้เป็นวัตถุที่ไม่ใช่อาร์เรย์ให้เรียกใช้วิธีการคัดลอกลึกซ้ำ ๆ
หากไม่ใช่ "วัตถุ" เพียงแค่คัดลอกตามปกติ
นี่คือการใช้งานของฉัน:
การคัดลอกรหัสมีดังนี้:
Object.prototype.deepcopy = function () {
var obj, i;
obj = {};
สำหรับ (attain ในนี้) {
if (this.hasownproperty (attr)) {
if (typeof (นี้ [attain]) === "Object") {
if (นี้ [attain] === null) {
obj [attr] = null;
-
อื่นถ้า (object.prototype.toString.call (นี้ [attain]) === '[อาร์เรย์วัตถุ]') {
obj [attr] = [];
สำหรับ (i = 0; i <this [attr] .length; i ++) {
obj [attr] .push (นี้ [attain] [i] .deepcopy ());
-
} อื่น {
obj [attr] = นี้ [attr] .deepcopy ();
-
} อื่น {
obj [attr] = นี้ [attr];
-
-
-
คืน OBJ;
-
หากเบราว์เซอร์รองรับ ECMAScript 5 คุณสามารถใช้มันเพื่อคัดลอกคุณสมบัติทั้งหมดของคุณสมบัติวัตถุอย่างลึกซึ้ง
การคัดลอกรหัสมีดังนี้:
Object.defineProperty (obj, attr, object.getownpropertydescriptor (this, attr));
เพื่อแทนที่
การคัดลอกรหัสมีดังนี้:
obj [attr] = นี้ [attr];
ข้อได้เปรียบของการใช้วิธีนี้โดยตรงบน Object.prototype คือวัตถุทั้งหมดสืบทอดวิธีการ ข้อเสียคือไลบรารีบางแห่งจะเขียนวัตถุวัตถุอีกครั้งดังนั้นบางครั้งความขัดแย้งก็เกิดขึ้น สิ่งนี้จะต้องให้ความสนใจ วิธีการใช้งานเฉพาะมีดังนี้:
การคัดลอกรหัสมีดังนี้:
Object.prototype.deepcopy = function () {... }
var a = {x: 1};
var b = a;
var c = a.deepcopy ();
ขวาน = 2;
bx = 3;
console.log (ขวาน); // 3
console.log (bx); // 3
console.log (cx); // 1
ข้างต้นเป็นคำอธิบายเกี่ยวกับการจำลองแบบลึก อย่างไรก็ตามเนื่องจากเราได้พูดคุยเกี่ยวกับการจำลองแบบลึกวันนี้เราต้องการมีการจำลองแบบตื้นอย่างต่อเนื่อง มาสรุปความเหมือนและความแตกต่างระหว่างพวกเขาสั้น ๆ
สำเนาตื้น (การโคลนเงา): คัดลอกเฉพาะประเภทพื้นฐานของวัตถุและประเภทวัตถุยังคงเป็นของการอ้างอิงดั้งเดิม
สำเนาลึก (การโคลนลึก): มันไม่ได้คัดลอกคลาสพื้นฐานของวัตถุ แต่ยังคัดลอกวัตถุในวัตถุต้นฉบับ กล่าวคือมันถูกสร้างขึ้นอย่างสมบูรณ์โดยวัตถุใหม่