Dalam JavaScript, fungsi adalah objek bertipe Function
yang berisi properti dan metode. Prototipe (Prototype)
adalah atribut dari objek tipe Function
.
Atribut prototype
disertakan ketika fungsi didefinisikan, dan nilai awalnya adalah objek kosong. Tidak ada tipe prototipe yang ditentukan untuk fungsi dalam JavaScript, sehingga prototipe dapat berupa tipe apa pun.
Prototipe digunakan untuk menyimpan properti dan metode bersama dari objek . Properti dan metode prototipe tidak mempengaruhi properti dan metode dari fungsi itu sendiri.
// Properti tipe Fungsi -> properti yang dimiliki semua fungsi console.log(Function.prototype); //[Function] //Definisikan fungsi fungsi fn() { console.log('ini adalah fungsi'); } //Nilai default prototipe adalah objek kosong console.log(fn.prototype); //fn {} // Fungsi berisi konstruktor --> semua tipe referensi sebenarnya adalah konstruktor console.log(Number.prototype); //[Nomor: 0] console.log(Object.prototype);//{}
Anda bisa mendapatkan prototipe objek dengan dua cara berikut untuk menyetel properti dan metode bersama:
prototype
konstruktorgetPrototype
dari metode Objek objek (obj).fungsi fn() { console.log('ini adalah fungsi'); } //Gunakan struktur sintaksis atribut dari objek akses console.log(fn.prototype); //fn {} console.log(fn['prototipe']);//fn {} //Jenis objek menyediakan metode getPrototypeOf() console.log(Object.getPrototypeOf(fn)); //[Function]
Metode Object.getOwnPropertyDescriptors()
digunakan untuk mendapatkan deskriptor dari semua propertinya sendiri dari suatu objek.
var hasil = Object.getOwnPropertyDescriptor(Object.prototype,'constructor'); console.log(result) //Hasil outputnya adalah sebagai berikut: //{ // nilai: [Fungsi: Objek], // dapat ditulis: benar, // dapat dihitung: salah, // dapat dikonfigurasi: benar // }
constructor是在创建函数的时候自动添加的,指向构造函数本身
Anda dapat mengatur properti dan metode prototipe dengan dua cara berikut:
Constructor.prototype.Attribute name = nilai atribut; Constructor.prototype.Method name = function(){};
Ketika kita perlu menambahkan banyak atribut ke prototipe, terlalu merepotkan untuk menulis
构造函数.prototype.属性名
berulang kali. Kita dapat langsung memodifikasi seluruhprototype
konstruktor.prototipe = { Nama atribut: nilai atribut, Nama metode: function(){}}
function foo () {}foo.prototype = { konstruktor: foo, nama: 'selai', usia: 18, alamat: 'Beijing'}var fn = new foo()console.log(fn.address) //Beijing
Setiap objek akan memiliki metode isPrototypeOf()
, yang digunakan untuk menentukan apakah objek tersebut prototipe objek lain.
Contoh kodenya adalah sebagai berikut: // Definisikan objek melalui penginisialisasi var obj = { nama: 'selai' } //Definisikan fungsi konstruktor Hero() {} // Tetapkan objek obj ke prototipe konstruktor Hero Hero.prototype = obj; // Membuat objek melalui konstruktor var hero = new Hero(); // Metode isPrototypeOf() menentukan apakah objek yang ditentukan merupakan prototipe objek lain var result = obj.isPrototypeOf(hero); console.log(result);//true
memverifikasi bahwa objek
obj
adalah prototipe dari objekhero
Selanjutnya kita menggunakan sepotong kode untuk memperluas pemahaman kita tentang rantai prototipe:
Skenario : Temukan objek pada objek obj Langkah-langkah yang dilakukan oleh atribut alamat js: 1. Operasi get akan dipicu. 2. Pencarian atribut pada objek saat ini. 3. Jika tidak ditemukan, pencarian akan dilakukan pada objek rantai prototipe (__proto__) 1. Pencarian akan berakhir .Jika tidak ditemukan, maka akan terus mencari sepanjang rantai prototipe hingga prototipe tingkat atas ditemukan (prototipe tingkat atas untuk sementara tidak jelas)
var obj = { nama: 'selai', usia: 19 } /* Persyaratan: Temukan atribut alamat pada objek obj*/ // Rantai prototipe dicari lapis demi lapis. Jika tidak ditemukan, maka akan dicari hingga prototipe tingkat atas ditemukan. obj.__proto__.__proto__ = {} obj.__proto__.__proto__.__proto__ = { alamat: 'Beijing' } console.log(obj.address) // Beijing console.log(obj.__proto__.__proto__.__proto__) // { alamat: 'Beijing' }
Terakhir temukan atribut alamat
那么这里有一个问题,如果一直没有查到,会无穷尽的去查找吗?接下来我们就来了解一下
Seperti yang kami sebutkan di atas, kami tidak akan mencari tanpa henti di sepanjang rantai prototipe. Ketika prototipe tingkat atas ditemukan, undefined
akan dikembalikan jika belum ditemukan.
Jadi apa prototipe tingkat atas itu?
Contoh kodenya adalah sebagai berikut:
var obj = { name: 'jam' }console.log(obj.__proto__) // {}console.log(obj.__proto__.__proto__) //
Prototipe objek literal null obj adalah:
{}
.{}
adalah prototipe tingkat atas. Saat kita terus mencetak__proto__
ke atas, nilai null dikembalikan, yang membuktikan bahwa lapisan sebelumnya sudah menjadi prototipe tingkat
atas hilang di potongan kode pertama:
顶层原型就是Object.prototype
3.1 Jadi di manakah akhir dari rantai prototipe? Misalnya, apakah objek ketiga juga memiliki atribut prototype __proto__
?
var obj = {nama:'jam'}obj.__proto__ = {}obj.__proto__.__proto__ = {}obj.__proto__.__proto__.__proto__ = {}console.log(obj.__proto__.__proto__.__proto__.__proto__) // {}
Kami menemukan bahwa hasil cetak di atas adalah空对象{}
var obj = { nama: 'selai', usia: 19 } konsol.log(obj.__proto__) // {} console.log(Objek.prototipe) // {} console.log(obj.__proto__ === Object.prototype) // true
Object adalah kelas induk dari semua kelas, jadi obj.__proto__ sebenarnya adalah Object.prototype,
console.log(obj.__proto__ === Object.prototype) // true
kita dapat melihat bahwa hasil Object.prototype adalah prototipe tingkat atas.
{}
3.2 Lalu kita mungkin bertanya : {}
Apakah ada yang spesial dari prototipe?
console.log(obj.__proto__.__proto__.__proto__.__proto__.__proto__) // null
Object.prototype
constructor
objek kosong {}, namun tidak kosong, tetapi properti di dalamnya tidak dapat dihitung properti untuk dilihat <!-- Terlihat ada atribut konstruktor dan tidak kosong -->console.log(Object.prototype.constructor) // [Fungsi: Objek] <!-- konstruktor merujuk kembali ke Objek -->
Object.prototype
melalui metode Object.getOwnPropertyDescriptors()
. console.log(Object.getOwnPropertyDescriptors(Object.prototype)) //Seperti yang ditunjukkan pada tangkapan layar panjang di bawah