Rumah > hujung hadapan web > tutorial js > Mengapa Tidak Kemas Kini Harta `pembina` JavaScript Semasa Pewarisan Prototaip?

Mengapa Tidak Kemas Kini Harta `pembina` JavaScript Semasa Pewarisan Prototaip?

Barbara Streisand
Lepaskan: 2024-12-01 05:05:17
asal
618 orang telah melayarinya

Why Doesn't JavaScript's `constructor` Property Update During Prototypal Inheritance?

Warisan JavaScript: Memahami Harta Pembina

Soalan:

Pertimbangkan kod:

function a() {}
function b() {}
function c() {}

b.prototype = new a();
c.prototype = new b();

console.log((new a()).constructor); //a()
console.log((new b()).constructor); //a()
console.log((new c()).constructor); //a()
Salin selepas log masuk

Mengapa bukan harta pembina dikemas kini untuk b dan c, walaupun menetapkan prototaip mereka untuk diwarisi daripada a?

Jawapan:

Untuk memahami perkara ini, mari kita memulakan perjalanan konseptual:

  • Apabila mencipta fungsi seperti fungsi Foo() {}, JavaScript secara dalaman mencipta tika Fungsi (pembina fungsi).
  • Setiap fungsi pembina mempunyai sifat prototaip, iaitu penunjuk kepada objek prototaipnya.
  • Objek prototaip mempunyai sifat pembina yang menunjuk kembali ke fungsi pembinanya.
  • Apabila mencipta tika baharu Foo dengan Foo() baharu, objek baharu dicipta dan sifat [[proto]] dalamannya menghala ke prototaip pembina.

Sekarang, persoalan timbul: kenapa sifat pembina tidak ditakrifkan pada objek contoh itu sendiri? Pertimbangkan contoh berikut:

function defclass(prototype) {
  var constructor = prototype.constructor;
  constructor.prototype = prototype;
  return constructor;
}

var Square = defclass({
  constructor: function (side) { this.side = side; },
  area: function () { return this.side * this.side; }
});

var square = new Square(10);

console.log(square.area()); // 100
Salin selepas log masuk

Dalam contoh ini, sifat pembina ialah kaedah prototaip seperti yang lain. Walau bagaimanapun, ia digunakan secara khusus untuk memulakan kejadian prototaip.

Mentakrifkan sifat pembina pada prototaip memberikan beberapa kelebihan:

  • Ketepatan logik: Contohnya, Object.prototype.constructor menunjuk ke Objek. Jika ia ditakrifkan pada contoh, ia akan menjadi tidak ditakrifkan untuk Object.prototype kerana ia adalah contoh nol.
  • Ketekalan dengan kaedah prototaip lain: Ini memudahkan pelaksanaan yang baharu, yang tidak perlu mentakrifkan sifat pembina pada setiap tika.
  • Kecekapan: Semua kejadian berkongsi sifat pembina yang sama, mengurangkan ingatan overhed.

Warisan dan Harta Pembina

Dalam kes pewarisan, sifat prototaip pembina terbitan ditetapkan kepada contoh pembina asas . Akibatnya, sifat dalaman [[proto]] bagi contoh pembina terbitan juga menunjuk kepada prototaip pembina asas. Ini menghasilkan sifat pembina contoh pembina terbitan yang menunjuk kepada pembina asas.

Operator instanceof

Operator instanceof beroperasi pada objek instance dan fungsi pembina. Bertentangan dengan kepercayaan popular, ia tidak bergantung pada sifat pembina contoh itu. Sebaliknya, ia merentasi rantaian prototaip contoh dan menyemak sama ada sifat [[proto]] dalamannya sepadan dengan sifat prototaip pembina. Padanan mengembalikan benar, manakala penghujung rantai prototaip mengembalikan palsu.

Atas ialah kandungan terperinci Mengapa Tidak Kemas Kini Harta `pembina` JavaScript Semasa Pewarisan Prototaip?. 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