Cara mendapatkan nama kelas dinamis di javascript

Hai 😀. Saya mengalami sedikit masalah dengan kode saya dan berpikir mungkin seseorang dapat membantu. Pada dasarnya, saya memiliki kumpulan kelas yang ingin saya pilih satu untuk ditetapkan ke variabel instan opsional. Saya mencari agar pilihan itu dibuat oleh nilai indeks yang mengambil nama kelas dari sebuah array. Saya kesulitan mencari tahu cara menentukan kelas langsung dari string nama kelas


Bagaimana ini seharusnya bekerja. Saya memiliki sejumlah kelas, dalam contoh ini Gajah, Gorila dan Harimau. Saya juga memiliki array String, classNames, dengan nilai yang cocok dengan nama kelas tersebut. Selain itu, saya memiliki variabel Int, classIndex, yang digunakan untuk memilih kelas mana yang akan digunakan. Yang saya inginkan adalah agar variabel instan saya, hewan, dapat mengasumsikan kelas yang dipilih setelah deklarasi awalnya. Terakhir, saya ingin animal dapat menjalankan metode khusus di kelas yang diasumsikannya


Kode contoh


var animal: Any?

var classNames = ["Elephant", "Gorilla", "Tiger"]
var classIndex = 2

setupAnimal()
moveAnimal()

func setupAnimal() {
     if classNames[classIndex] == "Elephant" {
          animal = Elephant()
          addChild(animal! as! Elephant)
     } else if classNames[classIndex] == "Gorilla" {
          animal = Gorilla()
          addChild(animal! as! Gorilla)
     } else if classNames[classIndex] == "Tiger" {
          animal = Tiger()
          addChild(animal! as! Tiger)
     }
}

func moveAnimal() {
     if classNames[classIndex] == "Elephant" {
          (animal! as! Elephant).move()
     } else if classNames[classIndex] == "Gorilla" {
          (animal! as! Gorilla).move()
     } else if classNames[classIndex] == "Tiger" {
          (animal! as! Tiger).move()
     }
}


Dengan menyetel animal pada awalnya ke Any?, saya dapat memulainya nanti dengan salah satu kelas saya, dalam contoh ini Tiger, karena classIndex adalah 2. Ketika saya ingin mengakses metode custom move() di Tiger, saya menggunakan operator as untuk mengakses animal sebagai kelas Tiger. Ini berfungsi dengan baik dan bagus, tetapi tidak dinamis. Bagi saya untuk terus memaksa kelas, saya harus meng-hardcode persyaratan untuk memeriksa setiap nama kelas, yang jauh dari ideal


Apakah ada cara untuk menghindari persyaratan ini dengan menentukan kelas langsung dari nama kelas yang dipilih. namakelas[indekskelas]?

Terima kasih atas tanggapannya, OOPer 🙂


Saya mencoba banyak hal, tetapi pasti membuat entitas untuk hewan itu sendiri membantu, dan itu membuat semuanya lebih ramping secara umum. Jadi, saya melanjutkan untuk membuat kelas baru Hewan, yaitu subkelas kelas tipe hewan. Saya punya alasan untuk membuat subkelas daripada menggunakan protokol. Nyatanya, seluruh tema binatang ini hanya ada di sini untuk membuat semuanya lebih mudah dipahami


Menggunakan kelas induk umum membuat banyak hal menjadi lebih dinamis dan sederhana. Namun, saya masih tidak bisa membuat kelas-dari-string berfungsi. Saya mencoba untuk menghindari hardcoding koleksi subclass Animal, karena idenya adalah mereka berasal dari data dan diasumsikan bahwa kelas-kelas itu ada. Saya mencoba NSClassFromString dan Bundle. utama. classNamed(), tapi saya tidak bisa membuatnya dilemparkan dan ditafsirkan dengan benar


Kode saya saat ini


var animal: Animal?

var classNames = ["Elephant", "Gorilla", "Tiger"]
var classIndex = 2

setupAnimal()
moveAnimal()

func setupAnimal() {
     let animalName = classNames[classIndex]

     if animalName == "Elephant" {
          animal = Elephant()
     } else if animalName == "Gorilla" {
          animal = Gorilla()
     } else if animalName == "Tiger" {
          animal = Tiger()
     }

     addChild(animal?)
}

func moveAnimal() {
     animal?.move()
}
_


Apa yang masih saya coba lakukan adalah menyingkirkan persyaratan yang tersisa dengan menentukan nama kelas dari string. Jadi, jika animalName == "Tiger" { animal = Tiger() } harus menjadi sesuatu yang mirip dengan animal = NSClassFromString(classNames[classIndex]), tapi saya tidak tahu persis apa

Saat Anda memilih elemen dalam aplikasi untuk ditargetkan oleh Userflow (mis. g. untuk tooltip), Userflow. js mengumpulkan informasi tentang elemen, seperti nama kelasnya dan atribut elemen lainnya, agar dapat menemukan elemen yang sama lagi nanti

Kami menyebutnya inferensi elemen proses ini

Jika aplikasi Anda menggunakan nama atau ID kelas dinamis, Userflow. js mungkin kesulitan menemukan elemen saat aplikasi Anda diterapkan lagi, jika nama kelas atau ID tersebut telah berubah

Anda dapat menyesuaikan Alur Pengguna. js untuk menghindari situasi ini

Jangan ragu untuk menghubungi kami jika kami dapat membantu Anda mengonfigurasi instalasi Anda

Kecualikan nama kelas dinamis

Contoh. Anda menggunakan solusi CSS-in-JS yang menghasilkan nama kelas dinamis pada format css-<hash>, di mana <hash> berubah setiap kali Anda menerapkan

Tambahkan baris berikut sebelum Anda memanggil userflow.init()

userflow.setInferenceClassNameFilter(cls => !cls.startsWith('css-'))

Anda juga dapat menggunakan ekspresi reguler lookahead negatif yang hanya cocok dengan string yang tidak dimulai dengan css-

userflow.setInferenceClassNameFilter(/^(?!css-).*/)

Lihat juga untuk cara memfilter berdasarkan beberapa pola, atau menggunakan fungsi, bukan ekspresi reguler

Perhatikan bahwa jika semua kelas css Anda dinamis, jalankan saja yang di atas

Kecualikan ID dinamis

Secara default, Userflow. js akan menggunakan atribut id_ elemen. Kecuali jika id diakhiri dengan angka. Ini untuk bekerja out-of-the-box dengan framework JS seperti Ember. js, yang menetapkan ID seperti

userflow.setInferenceClassNameFilter(/^(?!css-).*/)
0 ke semua elemen yang dikontrolnya

Bagaimana cara mendapatkan kelas dinamis di JavaScript?

Tambahkan kelas CSS secara dinamis dengan JavaScript .
Kode - JavaScript. elemen var = dokumen. .
Code - HTML. .
Kode - CSS. . .
Kode - JavaScript. fungsi addClass() { var teks = dokumen

Bagaimana cara menambahkan nama kelas dinamis di jQuery?

jQuery dilengkapi dengan addClass() dan removeClass() untuk menambah atau menghapus kelas CSS secara dinamis. Misalnya, $('#para1'). addClass('sorot'); .

Bagaimana cara mendapatkan nama kelas dalam HTML menggunakan JavaScript?

Untuk mendapatkan nama kelas dari Elemen HTML tertentu sebagai String, menggunakan JavaScript, dapatkan referensi ke elemen HTML ini, dan baca properti className dari Elemen HTML ini. className property returns the classes in class attribute separated by space, in a String.

Apa yang dikembalikan oleh JS getElementsByClassName ()?

Metode getElementsByClassName() mengembalikan kumpulan elemen dengan nama kelas tertentu . Metode getElementsByClassName() mengembalikan HTMLCollection. Properti getElementsByClassName() bersifat hanya-baca.