Saya membuat objek JavaScript, tetapi bagaimana saya bisa menentukan kelas objek itu?
Saya ingin sesuatu yang mirip dengan .getClass()
metode Java .
javascript
oop
DNB5brims
sumber
sumber
class
tipe. Itu memang memilikiclass
kata kunci danclass
sintaks untuk membuat prototipe di mana metode dapat lebih mudah diaksessuper
.Jawaban:
Tidak ada padanan pasti untuk Java
getClass()
di JavaScript. Sebagian besar itu karena JavaScript menjadi bahasa berbasis prototipe , sebagai lawan dari Jawa menjadi bahasa berbasis kelas .Bergantung pada apa yang Anda butuhkan
getClass()
, ada beberapa opsi dalam JavaScript:typeof
instanceof
obj.
constructor
func.
prototype
,proto
.isPrototypeOf
Beberapa contoh:
Catatan: jika Anda mengkompilasi kode Anda dengan Uglify akan mengubah nama kelas non-global. Untuk mencegah hal ini, Uglify memiliki
--mangle
param yang dapat Anda setel ke false menggunakan tegukan atau dengusan .sumber
func.prototype
(ya, fungsi adalah objek, tetapiprototype
properti hanya relevan pada objek fungsi).instanceof
/isPrototypeOf()
dan non-standar__proto__
Object.getPrototypeOf()
constructor.name
jika kode Anda sedang diperkecil. Nama fungsi akan berubah secara sewenang-wenang.construction.name
sebagai token untuk diabaikan / tidak diperkecil. Selain itu sebagian besar (jika tidak semua) perangkat lunak minifier memberikan aturan pengecualian.adalah metode yang dapat diandalkan di peramban modern.
Function.name
secara resmi ditambahkan ke standar dalam ES6, menjadikannya cara yang sesuai standar untuk mendapatkan "kelas" objek JavaScript sebagai string. Jika objek dipakaivar obj = new MyClass()
, itu akan mengembalikan "MyClass".Ini akan mengembalikan "Nomor" untuk angka, "Array" untuk array dan "Fungsi" untuk fungsi, dll. Umumnya berperilaku seperti yang diharapkan. Satu-satunya kasus di mana ia gagal adalah jika suatu objek dibuat tanpa prototipe, melalui
Object.create( null )
, atau objek itu instantiated dari fungsi (tanpa nama) yang didefinisikan secara anonim.Perhatikan juga bahwa jika Anda mengecilkan kode Anda, tidak aman untuk membandingkannya dengan string tipe hard-coded. Misalnya bukannya memeriksa jika
obj.constructor.name == "MyType"
, bukannya memeriksaobj.constructor.name == MyType.name
. Atau hanya membandingkan konstruktor sendiri, namun ini tidak akan bekerja melintasi batas DOM karena ada contoh berbeda dari fungsi konstruktor pada setiap DOM, sehingga melakukan perbandingan objek pada konstruktor mereka tidak akan berfungsi.sumber
Function.name
belum (belum) menjadi bagian dari standar JavaScript. Saat ini didukung di Chrome dan Firefox, tetapi tidak di IE (10).obj.constructor.name
hanya berfungsi untuk fungsi bernama . Yaitu, jika saya mendefinisikanvar Foo = function() {}
, maka untukvar foo = new Foo()
,foo.constructor.name
akan memberi Anda string kosong.constructor.name
jika kode Anda sedang diperkecil. Nama fungsi akan berubah secara sewenang-wenang.constructor.name
berperilaku seperti yang diharapkan dengan dukungan kelas baru di ES6.Fungsi ini mengembalikan
"Undefined"
nilai yang tidak ditentukan dan"Null"
untuk null.Untuk semua nilai lainnya,
CLASSNAME
-part diekstrak dari[object CLASSNAME]
, yang merupakan hasil dari menggunakanObject.prototype.toString.call(value)
.sumber
"Object"
.return obj.constructor.name
. Itu memberikan hasil yang sama, plus juga menangani benda-benda non asli.Untuk mendapatkan "pseudo class", Anda bisa mendapatkan fungsi konstruktor, oleh
dengan asumsi
constructor
diatur dengan benar ketika Anda melakukan warisan - yang oleh sesuatu seperti:dan dua baris ini, bersama dengan:
akan
woofie.constructor
menunjukkanDog
. Catatan ituDog
adalah fungsi konstruktor, dan merupakanFunction
objek. Tapi kamu bisa melakukannyaif (woofie.constructor === Dog) { ... }
.Jika Anda ingin mendapatkan nama kelas sebagai string, saya menemukan berikut ini berfungsi dengan baik:
http://blog.magnetiq.com/post/514962277/finding-out-class-names-of-javascript-objects
Ia sampai ke fungsi konstruktor, mengubahnya menjadi string, dan mengekstrak nama fungsi konstruktor.
Catatan yang
obj.constructor.name
bisa bekerja dengan baik, tetapi itu bukan standar. Ada di Chrome dan Firefox, tetapi tidak di IE, termasuk IE 9 atau IE 10 RTM.sumber
Anda bisa mendapatkan referensi ke fungsi konstruktor yang membuat objek dengan menggunakan properti konstruktor :
Jika Anda perlu mengonfirmasi jenis objek saat runtime Anda dapat menggunakan instanceof operator:
sumber
Sesuai dengan catatan kompatibilitas ke belakang yang tidak terputus, ECMAScript 6, JavaScript masih tidak memiliki
class
tipe (walaupun tidak semua orang mengerti ini). Itu memang memilikiclass
kata kunci sebagai bagian dariclass
sintaks untuk membuat prototipe — tetapi masih tidak ada yang disebut kelas . JavaScript tidak sekarang dan tidak pernah menjadi bahasa OOP klasik . Berbicara tentang JS dalam hal kelas hanya menyesatkan atau pertanda belum mendapatkan warisan prototipikal (hanya membuatnya nyata).Itu berarti
this.constructor
masih cara yang bagus untuk mendapatkan referensi keconstructor
fungsi. Danthis.constructor.prototype
adalah cara untuk mengakses prototipe itu sendiri. Karena ini bukan Java, ini bukan kelas. Ini adalah objek prototipe tempat instantiasi Anda berasal. Berikut ini adalah contoh menggunakan gula sintaksis ES6 untuk membuat rantai prototipe:Inilah yang dihasilkan oleh keluaran
babel-node
:Itu dia! Pada 2016, ada
class
kata kunci dalam JavaScript, tetapi masih tidak ada tipe kelas.this.constructor
adalah cara terbaik untuk mendapatkan fungsi konstruktor,this.constructor.prototype
cara terbaik untuk mendapatkan akses ke prototipe itu sendiri.sumber
Saya punya situasi untuk bekerja generik sekarang dan menggunakan ini:
Itulah satu-satunya cara yang saya temukan untuk mendapatkan nama kelas berdasarkan jenis input jika Anda tidak memiliki turunan objek.
(ditulis dalam ES2017)
notasi titik juga berfungsi dengan baik
sumber
Untuk Javascript Classes di ES6 bisa Anda gunakan
object.constructor
. Pada kelas contoh di bawah inigetClass()
metode mengembalikan kelas ES6 seperti yang Anda harapkan:Jika Anda instantiate kelas dari
getClass
metode pastikan Anda membungkusnya dalam tanda kurung misalnyaruffles = new ( fluffy.getClass() )( args... );
sumber
Saya menemukan
object.constructor.toString()
kembali[object objectClass]
di IE, daripadafunction objectClass () {}
kembali di chome. Jadi, saya pikir kode di http://blog.magnetiq.com/post/514962277/finding-out-class-names-of-javascript-objects mungkin tidak berfungsi dengan baik di IE. Dan saya memperbaiki kodenya sebagai berikut:kode:
sumber
Dalam javascript, tidak ada kelas, tapi saya pikir Anda menginginkan nama konstruktor dan
obj.constructor.toString()
akan memberi tahu Anda apa yang Anda butuhkan.sumber
.name
..name
tidak didefinisikan bahkan pada IE 9Setuju dengan dfa, itu sebabnya saya menganggap prototye sebagai kelas ketika tidak ada kelas bernama yang ditemukan
Ini adalah fungsi yang ditingkatkan dari yang diposting oleh Eli Gray, agar sesuai dengan cara pikiranku
sumber
Jika Anda tidak hanya perlu MENDAPATKAN kelas tetapi juga MEMPERPANJANG dari hanya memiliki sebuah instance, tulis:
mari kita miliki
jadi untuk memperpanjang A memiliki instance hanya gunakan:
sumber
Saya sarankan menggunakan
Object.prototype.constructor.name
:sumber
Berikut ini adalah implementasi dari
getClass()
dangetInstance()
Anda bisa mendapatkan referensi untuk menggunakan kelas Object
this.constructor
.Dari konteks contoh:
Dari konteks statis:
sumber
this.constructor
?Anda juga dapat melakukan hal seperti ini
Ini akan memberi tahu Anda apakah inputnya kelas atau tidak
sumber
Javascript adalah bahasa tanpa kelas: tidak ada kelas yang mendefinisikan perilaku kelas secara statis seperti di Jawa. JavaScript menggunakan prototipe sebagai ganti kelas untuk mendefinisikan properti objek, termasuk metode, dan pewarisan. Dimungkinkan untuk mensimulasikan banyak fitur berbasis kelas dengan prototipe dalam JavaScript.
sumber
class
tipe. Itu memang memilikiclass
kata kunci danclass
sintaks untuk membuat prototipe di mana metode dapat lebih mudah diaksessuper
.Pertanyaan sepertinya sudah dijawab tetapi OP ingin mengakses kelas dan objek, seperti yang kita lakukan di Jawa dan jawaban yang dipilih tidak cukup (imho).
Dengan penjelasan berikut, kita bisa mendapatkan kelas objek (sebenarnya disebut prototipe dalam javascript).
Anda dapat menambahkan properti seperti ini:
Tetapi
.last
properti hanya akan tersedia untukarr
objek yang dibuat dari prototipe Array. Jadi, agar.last
properti tersedia untuk semua objek yang dibuat dari prototipe Array, kita harus mendefinisikan.last
properti untuk prototipe Array:Masalahnya di sini adalah, Anda harus tahu jenis objek (prototipe) mana variabel '
arr
' dan 'arr2
' milik! Dengan kata lain, jika Anda tidak tahu tipe kelas (prototipe) dari objek 'arr
', maka Anda tidak akan dapat mendefinisikan properti untuk mereka. Dalam contoh di atas, kita tahu arr adalah turunan dari objek Array, itu sebabnya kami menggunakan Array.prototype untuk mendefinisikan properti untuk Array. Tetapi bagaimana jika kita tidak tahu kelas (prototipe) dari 'arr
'?Seperti yang Anda lihat, tanpa mengetahui bahwa '
arr
' adalah Array, kita dapat menambahkan properti baru hanya dengan merujuk kelas 'arr
' dengan menggunakan 'arr.__proto__
'.Kami mengakses prototipe '
arr
' tanpa mengetahui bahwa itu adalah contoh dari Array dan saya pikir itulah yang ditanyakan OP.sumber
__proto__
properti sudah ditinggalkan, dan memiliki hampir tidak ada keuntungan atasprototype
properti.