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

Bagaimanakah Warisan Prototaip Crockford Mengendalikan Objek Bersarang dan Warisannya?

Barbara Streisand
Lepaskan: 2024-12-01 13:01:10
asal
661 orang telah melayarinya

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

Warisan Prototaip Crockford: Objek Bersarang dan Warisan

Javascript: The Good Parts" Douglas Crockford menyokong untuk memudahkan pewarisan objek .create() kaedah untuk mengelakkan perangkap kata kunci baharu. Walau bagaimanapun, kebimbangan telah timbul mengenai gelagat objek bersarang apabila menggunakan corak ini.

Untuk menggambarkan isu ini, pertimbangkan contoh 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);
Salin selepas log masuk

Dalam contoh di atas, objek person1 mewarisi daripada flatObj, dan objek person2 mewarisi daripada nestObj. Apabila sifat objek bersarang diubah suai dalam objek yang diwarisi, ia memberi kesan kepada objek bersarang sehingga rantai prototaip.

person1.age = 69; // Overwrites `age` in `person1`
person2.info.age = 96; // Overwrites `age` in `person2` and `nestObj`
Salin selepas log masuk

Akibatnya, objek bersarang asal diubah, walaupun perubahan itu bertujuan semata-mata untuk objek yang diwarisi.

Tingkah laku ini tidak konsisten untuk objek rata. Jika flatObj.age diubah suai, ia tidak menjejaskan harta umur orang1.

flatObj.age = 23; // Only affects `flatObj`
Salin selepas log masuk

Ketidakkonsistenan timbul kerana objek bersarang dilayan secara berbeza daripada objek rata dalam corak warisan ini.

Mengatasi Had

Had corak dengan objek bersarang boleh ditangani dengan mencipta objek bebas untuk sifat bersarang sebelum menetapkannya:

person3 = {
    sex: "male"
}
person3.info = Object.create(nestObj2.info);
Salin selepas log masuk

Dengan berbuat demikian, sifat info person3 menjadi objek bebas, tidak terjejas oleh perubahan yang dibuat pada objek bersarang di atas rantai prototaip.

Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa pendekatan ini tidak mencipta objek bebas sepenuhnya. Jika sifat objek bersarang dipadamkan pada objek yang diwarisi, ia juga akan dipadamkan daripada objek prototaip:

delete child.x; // (child).x.a == 0, because child inherits from parent
Salin selepas log masuk

Ringkasnya, corak warisan prototaip Crockford dengan objek bersarang memang mempunyai had. Walau bagaimanapun, pengehadan ini boleh diatasi sebahagiannya dengan mencipta objek bebas untuk sifat bersarang sebelum menetapkannya.

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

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan