Pengantar Contoh Operator
Dalam JavaScript, menilai jenis variabel, Anda akan menggunakan operator Typeof. Saat menggunakan operator TypeOF, Anda akan memiliki masalah menggunakan jenis referensi untuk menyimpan nilainya. Tidak peduli apa jenis objek yang dirujuk, itu akan mengembalikan "objek". Ecmascript memperkenalkan contoh operator Java lain untuk menyelesaikan masalah ini. Contoh operator mirip dengan operator tipe dan digunakan untuk mengidentifikasi jenis objek yang sedang diproses. Berbeda dengan metode TypeOf, metode instanceof mengharuskan pengembang untuk secara eksplisit mengkonfirmasi bahwa objek adalah tipe tertentu. Misalnya:
Listing 1. Contoh dari contoh
var ostringObject = string baru ("Hello World"); console.log (ostringObject instance dari string); // output "true"Kode ini bertanya "Apakah variabel ostringObject merupakan instance dari objek string?" OstringObject memang merupakan instance dari objek string, jadi hasilnya "benar". Meskipun tidak sefleksibel metode TypeOf, metode instance off berguna ketika metode tipeof mengembalikan "objek".
Penggunaan Umum Contoh Operator:
Secara umum, menggunakan instanceof adalah untuk menentukan apakah suatu instance termasuk jenis tertentu. Misalnya:
Listing 2. Penggunaan umum contoh
// Tentukan apakah FOO adalah instance dari fungsi FOO Class foo () {} var foo = new foo (); console.log (foo instance dari foo) // trueSelain itu, titik yang lebih berat adalah bahwa contoh dapat digunakan dalam hubungan warisan untuk menentukan apakah instance milik tipe induknya. Misalnya:
Listing 3. Penggunaan instance dari dalam hubungan warisan
// Tentukan apakah FOO adalah instance dari FOO Class dan apakah itu adalah instance dari fungsi tipe induknya aoo () {} foO foo () {} foo.prototype = new aoo (); // javascript prototipe warisan var foo = new foo (); console.log (foo instance dari foo) // true console.log (foo instance dari aoo) // trueDalam kode di atas, kelas induk dalam lapisan hubungan warisan dinilai. Dalam hubungan warisan multi-lapisan, contoh operator juga berlaku.
Apakah Anda benar -benar memahami contoh operator?
Setelah membaca contoh kode di atas, apakah Anda pikir contoh operator sangat sederhana? Mari kita lihat beberapa penggunaan yang rumit.
Daftar 4. Contoh Penggunaan Kompleks
console.log (objek instance dari objek); // true console.log (function instanceof fungsi); // true console.log (angka nomor dari angka); // false console.log (string instanceof string); // false console.log (function instance Obyek); // console.log true foo (foO function function);//console true consol
Apakah Anda bingung lagi setelah membaca kode di atas? Mengapa objek dan fungsi contoh dari diri mereka sama benar, sementara contoh lain dari diri mereka sendiri tidak sama benarnya? Bagaimana cara menjelaskannya? Untuk secara fundamental memahami misteri instanceof, kita perlu memulai dari dua aspek: 1. Bagaimana mendefinisikan operator ini dalam spesifikasi bahasa. 2. Mekanisme pewarisan prototipe javascript.
Listing 5. JavaScript Kode Operator
function instance_of (l, r) {// l mewakili ekspresi kiri, r mewakili ekspresi yang tepat var o = r.prototype; // Ambil prototipe tampilan r l = l .__ proto __; // Ambil prototipe implisit L while (true) {if (l === null) mengembalikan false; if (o === l) // inilah intinya: ketika O setikal L, kembalikan true; L = l .__ proto__; }}Listing 6. Object Instance OF Object
// demi kenyamanan ekspresi, pertama membedakan antara ekspresi kiri dan ekspresi kanan objekl = objek, objectr = objek; // Berikut ini adalah untuk secara bertahap menyimpulkan O = objectr.prototype = object.prototype l = objekl .__ proto__ = function.prototype // penilaian pertama adalah o! = L // loop untuk menemukan apakah l masih memiliki __proTo__ l = function.prototype .__ proto__ = object.protype // the deck -function.
Daftar 7. Fungsi Fungsi Fungsi
// Demi kenyamanan ekspresi, pertama membedakan antara ekspresi kiri dan ekspresi kanan functionl = function, functionr = function; // Berikut ini adalah secara bertahap menyimpulkan O = functionr.prototype = function.prototype l = functionl .__ proto__ = function.prototype // penilaian pertama o == l // return true
Listing 8. Foo instance dari foo
// Demi kenyamanan ekspresi, pertama membedakan antara ekspresi kiri dan ekspresi kanan bodoh = foo, foor = foo; // Berikut ini adalah untuk secara bertahap menyimpulkan sesuai dengan spesifikasi o = foor.prototype = foo.prototype l = fool .__ proto__ = function.prototype // penilaian pertama adalah o! = L // penilaian pertama adalah o! = L // siklusnya adalah untuk menemukan apakah L masih memiliki __proto__ l = function.prototype. // Siklusnya adalah menemukan apakah saya masih memiliki __proTo__ l = object.prototype .__ proto__ = null // penilaian ketiga l == null // return false
Menganalisis secara singkat penerapan contoh dalam mekanisme warisan dojo
Dalam JavaScript, tidak ada konsep warisan berganda, seperti Java. Namun, ketika mendeklarasikan kelas di Dojo, warisan dari beberapa kelas diizinkan. Mari kita ambil dojo 1.6.1 sebagai contoh.
Listing 9. Ganda Warisan di Dojo
dojo.declare ("aoo", null, {}); dojo.declare ("boo", null, {}); dojo.declare ("foo", [aoo, boo], {}); var foo = new foo (); console.log (foo instance dari aoo); // true console.log (foo instance dari boo); // false console.log (foo.isinstanceof (aoo)); // true console.log (foo.isinstanceof (boo)); // true console.log (foo.isinstanceof (boo)); // true console.log (foo.isinstanceof (boo)); // true console.log (foo.isinstanceof (boo));Dalam contoh di atas, Foo mewarisi dari AOO dan Boo, tetapi ketika menggunakan instance dari operator untuk memeriksa apakah Foo adalah instance dari Boo, ia mengembalikan False. Faktanya, di dalam dojo, Foo masih mewarisi hanya dari AOO, dan menggunakan mekanisme mixin untuk menyalin metode dan properti di kelas boo untuk foo. Oleh karena itu, ketika instance dari operator digunakan untuk memeriksa apakah itu adalah contoh boo, false akan dikembalikan. Jadi Dojo menambahkan metode baru yang disebut isInstanceOf untuk setiap instance kelas, dan menggunakan metode ini untuk memeriksa beberapa warisan.