Kata instanceof
kunci dalam JavaScript bisa sangat membingungkan ketika pertama kali ditemukan, karena orang cenderung berpikir bahwa JavaScript bukan bahasa pemrograman berorientasi objek.
- Apa itu?
- Masalah apa yang dipecahkan?
- Kapan itu tepat dan kapan tidak?
javascript
operators
instanceof
Alon Gubkin
sumber
sumber
"foo" instanceof String
=> false,1 instanceof Number
=> false,{} instanceof Object
=> false. Katakan apa?!"foo" instanceof String => false
benar, karenatypeof "foo" == 'string'
.new String("foo") instanceof String => true
, karenatypeof String == 'function'
- Anda harus memperlakukan fungsi seperti kelas (definisi kelas). Variabel menjadiinstanceof
beberapafunction
(kelas) saat Anda menetapkannya sebagaivar v = new AnythingWhatTypeofEqualsFunction()
. Hal yang sama berlaku untuk1
.typeof 1 == 'number'
- 'number' is not 'function' :) Selanjutnya -{} instanceof Object
adaTRUE
di node dan browser modern({}) instanceof Object
akan kembalitrue
. Bahkan kode yang Anda tulis akan memberi Anda kesalahan.Jawaban:
contoh
Operan Sisi Tangan Kiri (LHS) adalah objek aktual yang sedang diuji ke operan Sisi Tangan Kanan (RHS) yang merupakan konstruktor aktual dari suatu kelas. Definisi dasarnya adalah:
Berikut adalah beberapa contoh bagus dan berikut adalah contoh yang diambil langsung dari situs pengembang Mozilla :
Satu hal yang layak disebutkan adalah nilai
instanceof
true jika objek mewarisi dari prototipe kelas:Itu
p instanceof Person
benar karenap
mewarisi dariPerson.prototype
.Sesuai permintaan OP
Saya telah menambahkan contoh kecil dengan beberapa kode sampel dan penjelasan.
Ketika Anda mendeklarasikan variabel, Anda memberinya jenis tertentu.
Misalnya:
Di atas menunjukkan beberapa variabel, yaitu
i
,f
, danc
. Jenisnya adalahinteger
,float
danCustomer
tipe data yang ditentukan pengguna . Jenis seperti di atas bisa untuk bahasa apa saja, bukan hanya JavaScript. Namun, dengan JavaScript saat Anda mendeklarasikan variabel yang tidak Anda tentukan jenisnya secara eksplisitvar x
,, x bisa berupa angka / string / tipe data yang ditentukan pengguna. Jadi apa yanginstanceof
dilakukannya adalah memeriksa objek untuk melihat apakah itu dari tipe yang ditentukan sehingga dari atas mengambilCustomer
objek yang bisa kita lakukan:Di atas kita telah melihat yang
c
dideklarasikan dengan tipeCustomer
. Kami sudah baru dan memeriksa apakah itu tipeCustomer
atau tidak. Tentu, itu mengembalikan benar. Kemudian masih menggunakanCustomer
objek yang kita periksa apakah itu aString
. Tidak, jelas bukanString
kita yang baru saja meluncurkanCustomer
objek, bukanString
objek. Dalam hal ini, ia mengembalikan false.Sesederhana itu!
sumber
color1 instanceof String;
ini akan mengembalikan true karena color1 adalah string.person p = new person()
p sekarang tipe orang dan bukan tipe string.var zero = 0; alert(zero); zero = "0"; alert(zero)
kami beralih dari primitifint
ke primitifstring
tanpa masalah.int
ke primitifstring
.Ada sisi penting dari contoh yang tampaknya tidak tercakup dalam salah satu komentar sejauh ini: warisan. Variabel yang sedang dievaluasi dengan menggunakan instanceof dapat mengembalikan true untuk beberapa "jenis" karena pewarisan prototypal.
Misalnya, mari kita tentukan jenis dan subtipe:
Sekarang kita memiliki beberapa "kelas" yang memungkinkan kita membuat beberapa instance, dan mencari tahu apa yang mereka contoh:
Lihat baris terakhir itu? Semua panggilan "baru" ke fungsi mengembalikan objek yang diwarisi dari Objek. Ini berlaku bahkan ketika menggunakan singkatan pembuatan objek:
Dan bagaimana dengan definisi "kelas" itu sendiri? Apa contohnya?
Saya merasa bahwa memahami bahwa objek apa pun dapat menjadi turunan dari jenis GANDA adalah penting, karena Anda saya (salah) menganggap bahwa Anda dapat membedakan antara, katakan dan objek dan fungsi dengan menggunakan
instanceof
. Seperti contoh terakhir ini jelas menunjukkan fungsi adalah objek.Ini juga penting jika Anda menggunakan pola pewarisan apa pun dan ingin mengonfirmasi keturunan objek dengan metode selain mengetik bebek.
Semoga itu bisa membantu siapa pun menjelajah
instanceof
.sumber
SubFoo.prototype = new Foo();
Anda dapat menambahkan lebih banyak metode untuk itu, dansubfoo instanceof Foo
cek masih akan lulus jugasubfoo instanceof SubFoo
Jawaban lain di sini benar, tetapi mereka tidak masuk ke dalam bagaimana
instanceof
sebenarnya bekerja, yang mungkin menarik bagi beberapa pengacara bahasa di luar sana.Setiap objek dalam JavaScript memiliki prototipe, yang dapat diakses melalui
__proto__
properti. Fungsi juga memilikiprototype
properti, yang merupakan inisial__proto__
untuk objek apa pun yang dibuat olehnya. Ketika suatu fungsi dibuat, itu diberikan objek unik untukprototype
. Theinstanceof
Operator menggunakan keunikan ini untuk memberikan jawaban. Inilah yanginstanceof
mungkin terlihat jika Anda menulisnya sebagai fungsi.Ini pada dasarnya memparafrasekan ECMA-262 edisi 5.1 (juga dikenal sebagai ES5), bagian 15.3.5.3.
Perhatikan bahwa Anda dapat menetapkan ulang objek apa pun ke properti fungsi
prototype
, dan Anda dapat menetapkan ulang__proto__
properti objek setelah dibangun. Ini akan memberi Anda beberapa hasil menarik:sumber
__proto__
properti " " tidak diperbolehkan di IE. Jika saya ingat dengan benar, manipulasi langsung dari properti juga tidak termasuk dalam spesifikasi ECMA sehingga mungkin merupakan ide yang buruk untuk menggunakannya untuk tugas selain dalam kegiatan akademik.Object.getPrototypeOf(o)
, ini akan sama dengan yang__proto__
Anda jelaskan, tetapi sesuai dengan ECMAScript.Saya pikir perlu dicatat bahwa instanceof ditentukan oleh penggunaan kata kunci "baru" ketika mendeklarasikan objek. Dalam contoh dari JonH;
Yang tidak dia sebutkan adalah ini;
Menentukan "baru" sebenarnya menyalin kondisi akhir fungsi konstruktor String ke dalam color1 var, bukan hanya mengaturnya ke nilai kembali. Saya pikir ini lebih baik menunjukkan apa kata kunci baru;
Menggunakan "baru" memberikan nilai "ini" di dalam fungsi ke var yang dideklarasikan, sementara tidak menggunakannya memberikan nilai kembali sebagai gantinya.
sumber
new
dengan semua jenis JavaScript yang membuat jawaban yang diterima jauh lebih membingungkan bagi pemula.text = String('test')
danoptions = {}
tidak akan diuji denganinstanceof
tetapi, sebaliknya, dengantypeof
sebaliknya.Dan Anda dapat menggunakannya untuk penanganan kesalahan dan debugging, seperti ini:
sumber
sumber
Javascript adalah bahasa prototipe yang artinya menggunakan prototipe untuk 'warisan'. yang
instanceof
Operator tes jika konstruktor fungsi iniprototype
propertype hadir dalam__proto__
rantai obyek. Ini berarti bahwa ia akan melakukan hal berikut (dengan asumsi testObj adalah objek fungsi):obj.__proto__ === testObj.prototype
>> jika initrue
instanceof
akan kembalitrue
.obj.__proto__.__proto__ === testObj.prototype
>> jika initrue
instanceof
akan kembalitrue
.testObj.prototype
makainstanceof
operator akan kembalifalse
.Contoh:
Itu memecahkan masalah dengan mudah memeriksa apakah suatu objek berasal dari prototipe tertentu. Misalnya, ketika suatu fungsi menerima objek yang dapat memiliki berbagai prototipe. Kemudian, sebelum menggunakan metode dari rantai prototipe, kita bisa menggunakan
instanceof
operator untuk memeriksa apakah metode ini ada di objek.Contoh:
Di sini, di
talk()
fungsi pertama diperiksa jika prototipe terletak pada objek. Setelah ini, metode yang sesuai diambil untuk dieksekusi. Tidak melakukan pemeriksaan ini dapat mengakibatkan mengeksekusi metode yang tidak ada dan dengan demikian kesalahan referensi.Kami agak sudah membahas ini. Gunakan saat Anda perlu memeriksa prototipe objek sebelum melakukan sesuatu dengannya.
sumber
PersonX.prototype.talk
, sehinggatalk
fungsi tersebut bisa dilakukanperson.talk()
.__proto__
dalam dokumentasi, itu sudah usang - tulisObject.getPrototype()
sajaPada pertanyaan "Kapan itu tepat dan kapan tidak?", 2 sen saya:
instanceof
jarang berguna dalam kode produksi, tetapi berguna dalam pengujian di mana Anda ingin menegaskan bahwa kode Anda mengembalikan / membuat objek dari jenis yang benar. Dengan secara eksplisit tentang jenis objek yang dikembalikan / dibuat oleh kode Anda, pengujian Anda menjadi lebih kuat sebagai alat untuk memahami dan mendokumentasikan kode Anda.sumber
instanceof
hanyalah gula sintaksis untukisPrototypeOf
:instanceof
hanya tergantung pada prototipe konstruktor suatu objek.Konstruktor hanyalah fungsi normal. Sebenarnya itu adalah objek fungsi, karena semuanya adalah objek dalam Javascript. Dan objek fungsi ini memiliki prototipe, karena setiap fungsi memiliki prototipe.
Prototipe hanyalah objek normal, yang terletak di dalam rantai prototipe objek lain. Itu berarti berada dalam rantai prototipe objek lain membuat objek prototipe:
The
instanceof
Operator harus dihindari karena palsu kelas, yang tidak ada di Javascript. Meskipunclass
kata kunci tidak dalam ES2015, karenaclass
lagi-lagi hanya gula sintaksis untuk ... tapi itu cerita lain.sumber
instanceof
berasal dariisPrototypeOf
. Saya menyebutnya gula sintaksis. Dan sumber MDN Anda adalah lelucon, bukan?instanceof
tidak melakukan hal yang samaisPrototypeOf
. Itu dia.Saya baru saja menemukan aplikasi dunia nyata dan akan menggunakannya lebih sering sekarang, saya pikir.
Jika Anda menggunakan acara jQuery, kadang-kadang Anda ingin menulis fungsi yang lebih umum yang juga dapat dipanggil langsung (tanpa acara). Anda dapat menggunakan
instanceof
untuk memeriksa apakah parameter pertama dari fungsi Anda adalah instance darijQuery.Event
dan bereaksi dengan tepat.Dalam kasus saya, fungsi yang diperlukan untuk menghitung sesuatu baik untuk semua (melalui acara klik pada tombol) atau hanya satu elemen tertentu. Kode yang saya gunakan:
sumber