Ada perbedaan besar antara warisan JavaScript dan warisan OOP standar. prototipe.superclass = c.Superclass = p.prototype;
Ketika var c = c baru (), c .__ proto__ = c.prototype;
Ketika C mengunjungi "variabel anggota", jika __proto__ tidak dapat diperoleh, Anda akan pergi ke C.Prototipe untuk menemukannya. dan yang lain dialokasikan selama definisi (setiap objek dibagikan). Modifikasi akan dibagikan oleh semua instance objek, yang melanggar niat asli desain kelas.
Misalnya:
Salin kode kode sebagai berikut:
'package'.j (function () {
'Class a'.j (function () {
jpublic ({{{{{
V: {A: 1}
});
jprivate ({{
P: {A: 1}
});
jProtect ({{
x: {a: 1}
});
});
'Kelas B memperluas a'.j (function () {
});
});
var b1 = baru b ();
b1.va = 5;
b1.xa = 5;
var b2 = baru b ();
Console.log (b1.va) // output sebagai 5
Console.log (b1.xa) // output sebagai 5
Console.log (b2.va) // output juga 5, tidak diharapkan 1
Console.log (b2.xa) // output sebagai 1
console.log (b2.pa) // tidak bisa, itu akan meminta p tanpa keberadaan
Bagaimana cara menyelesaikan masalah ini?
A. Variabel anggota "(itu sendiri adalah objek itu sendiri) seperti V tidak didefinisikan pada rantai asli, tetapi dipanggil dalam konstruktor. __proto__.
JS ++ menyediakan metode yang sama, selama "variabel anggota" atau "fungsi anggota" yang didefinisikan dalam JPrivate dialokasikan pada __proto__ luar, dan hanya contoh ini yang tersedia.
B. "Variabel anggota" hanya dibaca hanya dibaca pada rantai prototipe (itu adalah objek tersendiri)
Anggota "variabel anggota" (itu sendiri adalah objek) yang ditentukan oleh c.jpublic, hanya membaca hanya anggota, ingatlah untuk tidak ditugaskan, jika tidak itu akan dibagikan dalam berbagai kasus.