JavaScript mengacu pada karakteristik banyak bahasa; Misalnya, sintaks java, fungsi menggambar pada skema, prototipe warisan menarik dari diri sendiri, dan ekspresi reguler menarik dari perl. (DC JavaScript: Essence Bahasa).
Pertama, setiap JS adalah bahasa yang berorientasi objek berdasarkan prototipe warisan. Array di dalamnya adalah objek, fungsinya adalah objek, dan tentu saja "objek" masih merupakan objek. Selain itu, setiap objek memiliki slot internal [[prototipe]], yang merupakan kunci untuk menghubungkan rantai prototipe. Diakui, kita dapat mengatur properti prototipe untuk suatu objek, tapi jadi apa? Ini hanyalah sebuah manifestasi; Ada niat pembunuhan tersembunyi di baliknya.
Oke, maka saya dapat menggunakan isPrototypeOf () untuk memeriksa apakah suatu objek adalah prototipe objek lain; Namun, ini juga didasarkan pada rantai [prototipe].
Misalnya:
// Buat fungsi fungsi foo () {} // Ubah properti prototipe fungsi foo.prototype = {name: "foo.prototype"}; // Buat instance var a = new foo (); // Tulis ulang prototipe default A, yang seharusnya adalah foo.prototype. a.prototype = {name: "a.prototype"};Pertanyaan berikut adalah apakah foo.prototype adalah prototipe A? Lai
Ini perlu dilihat secara terpisah: di satu sisi A.Prototype memang {name: "a.prototype"}; Namun, hasil foo.prototype.isprototypeof (a) benar.
Mari kita lihat hubungan spesifik: (menggunakan ---> berarti rantai [[prototipe]] yang tidak signifikan, ---- berarti hubungan properti prototipe)
Function ---> function.prototype ---> object.prototype
Function.prototype <--- foo ---- foo.prototype ------> object.prototype.
Selain itu, [[protptype]] dari angka, boolean, string, dll. Masih menjadi objek function.prototype. Objek function.prototype adalah "fungsi", dan tidak mengandung [[konstruk]] di dalam, sehingga tidak dapat digunakan sebagai konstruktor; Faktanya, function.prototype serupa: function () {}. Selain slot internal [[prototipe]], tipe "fungsi" juga memiliki atribut prototipe. Setiap fungsi selalu memiliki objek prototipe: this.prototype = {constructor: this} (objek normal). [[Prototipe]] dari objek normal ini terhubung ke objek.prototype.
Apakah [prototipe]] dari objek instan yang dibuat oleh konstruktor objek.prototype?
[[Prototipe]] dari instance ini diinisialisasi oleh properti prototipe konstruktor. Perhatikan bahwa itu bukan [prototipe]] dari fungsi. Jadi jika itu adalah objek yang dibangun oleh fungsi objek, maka memang memang.
Objek adalah fungsi, prototipenya adalah objek yang terkenal.prototype (sedikit omong kosong), tetapi [[prototipe]] poinnya ke function.prototype. Silakan lihat di bawah:
Object -----> function.prototype ------> object.prototype.
Bagaimana cara mengubah rantai [[prototipe]] ini?
Dapat dalam bentuk var a = objek.create (obj) atau objek.setPrototypeof (obja, objb). Saya tidak berpikir ada kebutuhan untuk memberikan contoh, karena hubungannya sangat sederhana; Mari kita hanya berikan beberapa contoh jelek. Tidak masuk akal.
Pertanyaan terakhir adalah, apakah delegasi perilaku berdasarkan rantai [[prototipe]]?
Ya, itulah masalahnya.