tata bahasa
Contoh objek dari konstruktor
parameter
obyek:
Objek yang akan dideteksi.
Konstruktor:
Seorang konstruktor
menggambarkan:
Contoh operator digunakan untuk mendeteksi apakah konstruktor.prototype ada pada rantai prototipe objek parameter.
// Tentukan fungsi konstruktor c () {} function d () {} var o = new c (); // true, karena objek.getPrototypeOf (o) === C.Prototypeo instance dari c; // Salah, karena D.Prototype tidak pada rantai prototipe o instance d; o Contoh objek; // true, karena objek.prototype.isprototypeof (o) mengembalikan truec.prototype instance dari objek // true, sama seperti di atas c.prototype = {}; var o2 = c baru c (); o2 instance dari c; // trueo instance dari c; // false, c.prototype menunjuk ke objek kosong, yang tidak pada rantai prototipe O.D.Prototype = baru C (); // mewarisi var o3 = baru d (); o3 instance d; // trueO3 instance dari c; // BENARPerlu dicatat bahwa jika ekspresi OBJ instance Foo mengembalikan true, itu tidak berarti bahwa ekspresi akan mengembalikan Ture selamanya, karena nilai properti foo.pototype dapat berubah, dan nilai yang diubah mungkin tidak ada pada rantai prototipe OBJ, dan nilai ekspresi asli akan menjadi salah. Dalam kasus lain, nilai ekspresi asli juga akan berubah, yang merupakan kasus di mana rantai prototipe objek OBJ diubah. Meskipun dalam spesifikasi ES saat ini, kita hanya dapat membaca prototipe objek dan tidak dapat mengubahnya, itu dapat dicapai dengan bantuan atribut ajaib __proTo__ non-standar. Misalnya, setelah mengeksekusi OBJ .__ proto__ = {}, instance obj dari foo akan mengembalikan false.
Instanceof dan objek multi-global (interaksi antara beberapa frame atau beberapa jendela)
Di browser, skrip kami mungkin perlu berinteraksi di antara beberapa jendela. Beberapa jendela berarti beberapa lingkungan global, dan lingkungan global yang berbeda memiliki objek global yang berbeda, sehingga memiliki konstruktor tipe bawaan yang berbeda. Ini dapat menyebabkan beberapa masalah. Misalnya, ekspresi [] instanceof window.frames [0] .Array akan mengembalikan false karena array.prototype! == window.frames [0] .Array.prototype, jadi Anda harus menggunakan array.isArray (myobj) atau objek.prototype.tostring.call (myobj) == "[objek array]" ke Myobj.
Contoh
Penggunaan umum instance dari adalah untuk menentukan apakah A adalah tipe B:
console.log (contoh sejati dari boolean); // false console.log (nomor baru (1) Nomor Contoh dari); // BENAR
Contoh juga dapat menentukan jenis induk:
fungsi ayah () {} function child () {} child.prototype = ayah baru (); var a = new child (); console.log (instance dari anak); // trueconsole.log (contoh ayah); // BENARKonstruktor anak mewarisi dari ayah. Contoh A tidak diragukan lagi dibangun oleh anak, tetapi mengapa itu juga merupakan contoh ayah? Bahkan, kernel dari instance dari operator dapat dengan mudah dijelaskan dengan kode berikut:
Periksa fungsi (a, b) {while (a .__ proto__) {if (a .__ proto__ === B.Prototype) mengembalikan true; a = a .__ proto__; } return false;} function foo () {} console.log (objek instanceof objek === Periksa (objek, objek)); // true console.log (function instanceof function === Periksa (fungsi, fungsi)); // true console.log (Number instance dari nomor === Periksa (nomor, nomor)); // true console.log (string instanceof string === Periksa (string, string)); // true console.log (function instance dari objek === Periksa (fungsi, objek)); // true console.log (foo instanceF function === Periksa (foo, function)); // true console.log (foo instance dari foo === Periksa (foo, foo)); // true console.log (foo instance dari foo === Periksa (foo, foo)); // true console.log (foo instance dari foo === Periksa (foo, foo)); // BENARSederhananya, jika A adalah contoh B, maka A pasti dapat menggunakan metode dan sifat yang ditentukan dalam prototipe B. Kemudian, dalam kode, itu berarti ada objek dengan nilai yang sama dalam rantai prototipe dengan B.Prototype, jadi ikuti saja rantai prototipe A untuk mencari lapisan demi lapisan.
Perlu juga dicatat bahwa boolean dan fungsi string adalah fungsi, dan fungsi dibangun secara seragam dari fungsi. Mereka seperti fungsi sederhana apa pun, dan mereka dapat menggunakan properti prototipe pada fungsi:
Function.prototype.a = 10; console.log (string.a); // 10
Akhirnya, mari kita bicara secara singkat tentang dua pertanyaan pertama.
// Demi kenyamanan ekspresi, pertama membedakan ekspresi kiri dan ekspresi kanan functionl = function, functionr = fungsi; // Di bawah ini secara bertahap disimpulkan sesuai dengan spesifikasi o = functionr.prototype = function.prototype l = functionl .__ proto__ = function.prototype // penilaian pertama o == l // return true // demi kenyamanan ekspresi, pertama membedakan ekspresi kiri dan ekspresi kanan stringl = string, stringr = string; // Below is gradually deduced according to the specifications O = StringR.prototype = String.prototype L = StringL.__proto__ = Function.prototype // The first time judges O != L // Loops again to find whether L still has __proto__ L = String.prototype.__proto__ = Object.prototype // The second time judges O != L // Loops again to find whether L still has __proto__ l = string.prototype .__ proto__ = null // yang ketiga kalinya menilai l == null // return false