Rumah >hujung hadapan web >tutorial js >Bagaimanakah Warisan Prototaip Crockford Mengendalikan Objek Bersarang dan Pengubahsuaian Harta?

Bagaimanakah Warisan Prototaip Crockford Mengendalikan Objek Bersarang dan Pengubahsuaian Harta?

DDD
DDDasal
2024-12-05 18:24:13530semak imbas

How Does Crockford's Prototypal Inheritance Handle Nested Objects and Property Modification?

Warisan Prototaip Crockford: Isu dengan Objek Bersarang

Corak warisan prototaip Douglas Crockford, yang digariskan dalam bukunya "Parts,"Javascript: The Good memudahkan pewarisan objek dan mengelakkan kekeliruan yang berkaitan dengan kata kunci "baharu". Walau bagaimanapun, apabila cuba mewarisi daripada objek bersarang menggunakan corak ini, isu timbul: menimpa sifat objek bersarang menjejaskan keseluruhan rantai prototaip.

Pertimbangkan kod berikut:

var flatObj = {
    firstname: "John",
    lastname: "Doe",
    age: 23
}
var person1 = Object.create(flatObj);

var nestObj = {
    sex: "female",
    info: {
        firstname: "Jane",
        lastname: "Dough",
        age: 32  
    }
}
var person2 = Object.create(nestObj);

var nestObj2 = {
    sex: "male",
    info: {
        firstname: "Arnold",
        lastname: "Schwarzenneger",
        age: 61  
    }
}
var person3 = {
    sex: "male"
}
person3.info = Object.create(nestObj2.info);

// now change the objects:
person1.age = 69;
person2.info.age = 96;
person3.info.age = 0;

// prototypes should not have changed:
flatObj.age // 23
nestObj.info.age // 96 ???
nestObj2.info.age // 61

// now delete properties:
delete person1.age;
delete person2.info.age;
delete person3.info.age;

// prototypes should not have changed:
flatObj.age // 23
nestObj.info.age // undefined ???
nestObj2.info.age // 61

Dalam ini contoh, selepas mewarisi daripada objek bersarang nestObj, menukar sifat objek bersarang secara person2 mempengaruhi prototaip nestObj, dan begitu juga untuk objek bersarang person3. Ini adalah tingkah laku yang tidak dijangka dan menjejaskan tujuan yang dimaksudkan corak untuk mengasingkan perubahan pada objek individu.

Punca ketidakkonsistenan ini terletak pada sifat asas pewarisan dalam objek JavaScript. Apabila objek mewarisi daripada yang lain, ia mencipta rujukan kepada sifat objek itu daripada mencipta salinan bebas. Ini bermakna bahawa sebarang perubahan yang dibuat pada sifat yang diwarisi akan mencerminkan kedua-dua objek anak dan prototaip.

Untuk mengelakkan isu ini, seseorang mesti mencipta objek baharu secara eksplisit untuk sifat bersarang sebelum mewarisinya. Ini memastikan bahawa perubahan pada sifat bersarang diasingkan kepada objek kanak-kanak. Oleh itu, kod yang betul hendaklah:

person3.info = Object.create(nestObj2.info); // Create a new object for the nested property
person3.info.age = 0; // Change the age property without affecting the prototype

Atas ialah kandungan terperinci Bagaimanakah Warisan Prototaip Crockford Mengendalikan Objek Bersarang dan Pengubahsuaian Harta?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn