Untuk mengetahui rantai prototipe, Anda harus terlebih dahulu mencari tahu jenis fungsi. Kelas memiliki fitur yang sangat penting, yaitu dapat membuat objek dengannya sebagai templat berdasarkan konstruktornya. Dalam JavaScript, fungsi memiliki 2 fungsi
Pertama, sebagai panggilan fungsi umum
Kedua, konstruktor objek prototipenya baru ()
Mari kita ambil contoh
Salinan kode adalah sebagai berikut:
fungsi a () {
this.name = 'a';
}
Apa yang terjadi ketika suatu fungsi dibuat?
Pertama, itu akan membuat objek fungsi, yaitu sendiri
Kedua, itu akan membuat objek prototipe @A (dilambangkan dengan @)
Ketiga, objek fungsi akan memiliki pointer prototipe, yang menunjuk ke objek prototipe yang sesuai, dan di sini menunjuk ke @A
Keempat, ada penunjuk konstruktor di objek @A, menunjuk ke konstruktornya, di sini menunjuk ke a
http://img.blog.csdn.net/20140222125611500?watermark/2/text/ahr0cdovl2jsb2cUy3nkbi5uzxqvbpsmtu3mdex/font/5a6l5l2tqvbpsmTU/font /Gravitasi/Tenggara
Apa gunanya atribut prototipe ini?
Faktanya, atribut prototipe mewakili kisaran yang dapat dikendalikan oleh fungsi saat ini (atau menunjukkan bahwa konstruktor fungsi saat ini). Di sini adalah konstruktor dari objek prototipe @A, jadi kita akan melihat bahwa ada metode penulisan seperti itu .
Salinan kode adalah sebagai berikut:
fungsi a () {
this.name = 'a';
}
var a1 = new a ();
Ini mirip dengan bahasa umum lainnya.
Kemudian memodifikasi sifat -sifat prototipe yang menunjuk ke objek akan memengaruhi semua contoh yang dibuat dengannya sebagai templat.
Salinan kode adalah sebagai berikut:
fungsi a () {
this.name = 'a';
}
var a1 = new a ();
a.prototype.age = 1;
peringatan (a1.age);
Hasil: 1
Lalu mengapa objek A1 dapat secara langsung mengakses atribut usia? Saya tidak mendefinisikan atribut usia di objek A1.
Itu karena akan ada referensi di semua contoh _proto_ (dapat diakses langsung di bawah firfox, chrome, tetapi IE tidak mendukungnya) menunjuk ke prototipe ini, di sini menunjuk ke @A,
Salinan kode adalah sebagai berikut:
fungsi a () {
this.name = 'a';
}
var a1 = new a ();
Peringatan (A1._PROTO_ == a.prototype)
Hasil: Benar
Saat mengakses atribut, Anda akan mencari di dalam objek A1. T menemukannya, Anda akan kembali tidak ditentukan.
Pada titik ini, arti rantai prototipe keluar. Object.prototype adalah prototipe tingkat atas, jadi jika objek.prototype properti dimodifikasi, itu akan mempengaruhi semua objek.
Melihat sepotong kode
Salinan kode adalah sebagai berikut:
fungsi a () {
this.name = 'a';
}
fungsi b () {
this.age = 1;
}
b.prototype = baru a ();
waspada (new b (). name);
Kami menunjukkan bahwa B menunjuk prototipe B ke instance A, dan kemudian contoh B juga dapat mengakses properti a. Ini adalah warisan JavaScript, jadi mengapa B.Prototipe menunjuk ke instance A, daripada secara langsung menunjuk ke A.Prototipe?
Salinan kode adalah sebagai berikut:
b.prototype = a.prototype baru;
Jika Anda memodifikasi properti dalam p.prototype seperti yang ditulis di atas, maka prototipe A juga akan berubah, yang setara dengan subclass yang memodifikasi kelas induk, dan sifat -sifat subkelas dan kelas induk digabungkan bersama, yang jelas -jelas bersifat tidak pantas. Dengan kata lain, B juga menjadi konstruktor @A, dan A dan B menjadi hubungan paralel.
Kita dapat mendefinisikannya selanjutnya:
Fungsi A mewarisi B, yang merupakan konstruktor yang membuat fungsi menjadi menjadi contoh dari prototipe fungsi B.
Salinan kode adalah sebagai berikut:
var $ = jQuery = function (selector, context) {
// Tidak mungkin membangun diri Anda lagi di konstruktor Anda sendiri, jadi contoh konstruktor lain dikembalikan
mengembalikan init baru (pemilih, konteks);
}
jQuery.fn = jQuery.prototype = {
ukuran: function () {
kembalikan ini.length;
}
}
fungsi init (selector, konteks) {
}
init.prototype = jQuery.fn ;;
}
Ini adalah kode sumber jQuery.
Menggunakan pengetahuan di atas, dapat dijelaskan bahwa jQuery hanyalah panggilan ke fungsi umum, yang mengembalikan objek yang dibuat oleh konstruktor lain dari prototipe jQuery, yaitu, init baru ()