Rumah > hujung hadapan web > tutorial js > Perbincangan ringkas tentang objek prototaip JS dan kemahiran prototaip chains_javascript

Perbincangan ringkas tentang objek prototaip JS dan kemahiran prototaip chains_javascript

WBOY
Lepaskan: 2016-05-16 15:12:24
asal
1392 orang telah melayarinya

Dalam Javascript, semuanya adalah objek, tetapi objek juga berbeza dan boleh dibahagikan secara kasar kepada dua kategori, iaitu: objek biasa (Objek) dan objek fungsi (Fungsi).

Secara umumnya, objek yang dijana melalui Fungsi baharu ialah objek fungsi, dan objek lain ialah objek biasa.

Contoh:

function f1(){
  //todo
}
var f2 = function(){
  //todo
};
var f3 = new Function('x','console.log(x)');
 
var o1 = {};
var o2 = new Object();
var o3 = new f1();
 
console.log(
  typeof f1,//function
  typeof f2,//function
  typeof f3,//function
  typeof o1,//object
  typeof o2,//object
  typeof o3 //object
);
>> function function function object object object
Salin selepas log masuk

f1 ialah pengisytiharan fungsi, cara paling biasa untuk mentakrifkan fungsi f2 sebenarnya adalah fungsi tanpa nama ini diberikan kepada f2, yang merupakan ungkapan fungsi, tetapi ia juga merupakan objek fungsi .

Fungsi ialah objek yang disertakan dengan JS Apabila f1 dan f2 dicipta, JS akan membina objek ini secara automatik melalui Function() baharu.

Terdapat dua cara untuk mencipta objek dalam Javascript: literal objek dan menggunakan ungkapan baharu Penciptaan o1 dan o2 sepadan dengan dua cara ini. , o3 ialah objek contoh bagi f1, o3 dan f1 adalah daripada jenis yang sama, sekurang-kurangnya saya pernah berfikir begitu, tetapi tidak begitu...

Jadi, bagaimana anda memahaminya? Ia sangat mudah. ​​Lihat sama ada o3 dijana melalui Fungsi baharu. Jelas sekali tidak, kerana ia bukan objek fungsi.

Selepas memahami mudah tentang objek fungsi dan objek biasa, mari kita lihat prototaip dan rantai prototaip dalam Javascript:

Dalam JS, apabila objek fungsi f1 dicipta, beberapa sifat akan dibina ke dalam objek, termasuk prototaip dan __proto__ ialah objek prototaip, yang merekodkan beberapa sifat dan kaedah f1.

Perlu diingat bahawa prototaip tidak dapat dilihat oleh f1, iaitu, f1 tidak akan mencari sifat dan kaedah dalam prototaip.

function f(){}
f.prototype.foo = "abc";
console.log(f.foo); //undefined
Salin selepas log masuk

Jadi, apakah kegunaan prototaip? Malah, fungsi utama prototaip ialah pewarisan. Dalam istilah orang awam, sifat dan kaedah yang ditakrifkan dalam prototaip dikhaskan untuk "keturunannya" sendiri Oleh itu, subkelas boleh mengakses sepenuhnya sifat dan kaedah dalam prototaip.

Untuk mengetahui cara f1 meninggalkan prototaip kepada "keturunan", kita perlu memahami rantaian prototaip dalam JS Pada masa ini, __proto__ dalam JS memasuki tempat kejadian mendalam bahawa anda sering tidak melihatnya, tetapi ia wujud dalam kedua-dua objek biasa dan objek fungsi Fungsinya adalah untuk menyimpan objek prototaip kelas induk Apabila JS mencipta objek melalui ungkapan baru, ia biasanya menyimpan kelas induk . Prototaip kelas diberikan kepada atribut __proto__ objek baharu, dengan itu membentuk warisan dari generasi ke generasi...

function f(){}
f.prototype.foo = "abc";
var obj = new f();
console.log(obj.foo); //abc
Salin selepas log masuk

Sekarang kita tahu bahawa __proto__ dalam obj menyimpan prototaip f, jadi apakah yang disimpan dalam __proto__ dalam prototaip f Lihat gambar di bawah:

Seperti yang ditunjukkan dalam rajah, Object.prototype disimpan dalam __proto__ f.prototype Terdapat juga __proto__ dalam objek Object.prototype. Daripada hasil output, Object.prototype.__proto__ adalah nol, menunjukkan prototaip objek obj. Penghujung rantai. Seperti yang ditunjukkan di bawah:

Selepas objek obj mempunyai rantai prototaip sedemikian, apabila obj.foo dilaksanakan, obj akan terlebih dahulu mencari sama ada ia mempunyai atribut, tetapi tidak akan mencari prototaipnya sendiri Apabila foo tidak ditemui, obj akan mengikuti prototaip rantai. Pergi dan cari...

Dalam contoh di atas, kami mentakrifkan atribut foo pada prototaip f Pada masa ini, obj akan mencari atribut ini pada rantai prototaip dan melaksanakannya.

Akhir sekali, ringkaskan perkara penting yang terlibat dalam artikel ini dalam beberapa ayat:

  • Pembentukan rantai prototaip benar-benar bergantung pada __proto__ dan bukannya prototaip Apabila enjin JS melaksanakan kaedah objek, ia mula-mula mencari sama ada kaedah itu wujud dalam objek itu sendiri tidak wujud, ia akan dicari pada rantaian prototaip , tetapi tidak akan menemui prototaipnya sendiri.
  • __proto__ objek merekodkan rantai prototaipnya sendiri dan menentukan jenis datanya sendiri Penukaran __proto__ adalah bersamaan dengan menukar jenis data objek.
  • Prototaip fungsi bukan milik rantai prototaipnya sendiri Ia adalah teras penciptaan subkelas, menentukan jenis data subkelas, dan merupakan jambatan yang menghubungkan rantai prototaip subkelas. .
  • Tujuan mentakrifkan kaedah dan sifat pada objek prototaip adalah untuk diwarisi dan digunakan oleh subkelas.

Di atas adalah keseluruhan kandungan artikel ini, saya harap ia akan membantu kajian semua orang.

Label berkaitan:
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan