Rumah  >  Artikel  >  hujung hadapan web  >  Melaksanakan Kaedah kaedah Ruby dalam JavaScript

Melaksanakan Kaedah kaedah Ruby dalam JavaScript

WBOY
WBOYasal
2024-07-31 06:30:13969semak imbas

Implementing Ruby

Tiba-tiba, bukankah kaedah kaedah Ruby berguna? Apabila menulis kod, ia menyenaraikan semua kaedah dan sifat yang tersedia untuk objek dan membolehkan anda mencari melaluinya, yang sangat berguna untuk nyahpepijat.

Selain itu, ia juga berkesan untuk menyemak kaedah khusus untuk rangka kerja seperti Rails, membantu dalam membaca kod dan memahami perpustakaan. Walaupun merupakan amalan yang baik untuk merujuk kepada dokumentasi rasmi atau kod sumber, kaedah kaedah agak membantu untuk perpustakaan yang anda tidak perlu menyelam secara mendalam atau apabila anda mempunyai ingatan yang samar-samar tentang nama kaedah.

Kaedah kaedah Ruby

Untuk memperkenalkan secara ringkas kaedah kaedah Ruby, ia kelihatan seperti ini:

Objek#kaedah

Mengembalikan senarai nama kaedah awam dan dilindungi bagi obj. Ini akan merangkumi semua kaedah yang boleh diakses dalam nenek moyang obj. Jika parameter pilihan adalah palsu, ia mengembalikan tatasusunan kaedah tunggal obj awam dan dilindungi, tatasusunan itu tidak akan menyertakan kaedah dalam modul yang disertakan dalam obj.

Dalam erti kata lain, ia mengembalikan objek tatasusunan sifat dan kaedah yang boleh diakses daripada penerima.

Kaedah ini dilaksanakan dalam kelas Object, yang merupakan nenek moyang semua kelas yang mewarisi daripada Object, jadi ia boleh digunakan dalam mana-mana kelas yang mewarisi daripada Object.

Kod Contoh

class Hoge
  attr_accessor :fuga

  def bar
    puts ''
  end
end

puts Hoge.new.methods     // => [:bar, :fuga=, :fuga, :hash, :singleton_class, :dup, ...]
puts Hoge.new.grep /fuga/ // => [:fuga=, :fuga]

Seperti yang ditunjukkan dalam contoh, ia mengembalikan objek Array, jadi anda juga boleh mencari melalui senarai kaedah menggunakan kaedah grep, yang sangat mudah.

Jadi, saya memikirkan sama ada ini boleh dilakukan dalam JS dan mencubanya.

Perlaksanaan

Di bawah ialah kod sebenar.

Nama kelas boleh apa sahaja, tetapi saya menamakannya PropertyFinder buat masa ini.

class PropertyFinder {
    constructor(receiver) {
      this.receiver = receiver
    }

    grep(regexp, options = {}) {
      let res = []
      if (typeof regexp === 'string') {
        return this.find((name) => name.includes(regexp))
      }
      if (regexp instanceof RegExp) {
        return this.find((name) => regexp.test(name))
      }
      return []
    }

    toString() {
      return this.find(() => true)
    }

    find(detect) {
      const list = Object.getOwnPropertyNames(this.receiver).filter(it => detect(it))
      if (!this.receiver.__proto__) {
        return list
      }
      const ancestors = new PropertyFinder(this.receiver.__proto__).find(detect)
      return [...list, ...ancestors]
    }
}

Saya akan menerangkan kod itu kemudian, tetapi mari kita mulakan dengan cara menggunakannya.

Setelah kelas ditakrifkan, anda boleh menambah kaedah pada sifat kelas Objek seperti berikut:

Object.prototype.methods = function () {
    return new PropertyFinder(this)
}

Dengan melakukan ini, anda boleh menggunakan kaedah kaedah pada contoh kelas yang mewarisi daripada Object. Walau bagaimanapun, sila ambil perhatian tentang nota berhati-hati di bawah dan gunakan ini atas risiko anda sendiri.

Berikut ialah beberapa contoh pelaksanaan:

class Hoge {
  fuga() {
    console.log('fuga')
  }
}

console.log(new Object().methods().toString()) // => ['constructor', 'constructor', '__defineGetter__', '__defineSetter__', 'hasOwnProperty' ...]
console.log([].methods().toString())           // => ['length', 'length', 'constructor', 'at', 'concat', ...]
console.log(new Hoge().methods().grep(/fuga/)  // => ['fuga']

Pengenalan Keselamatan

*Kod ini tidak disyorkan untuk digunakan dalam persekitaran pengeluaran *

Menambahkan sifat pada kelas peringkat lebih tinggi melalui tampalan monyet adalah anti-corak dan boleh membawa kepada masalah dengan perubahan masa depan dalam spesifikasi JS. Gunakannya dengan berhati-hati dan atas risiko anda sendiri.

Rujukan : Keburukan menampal monyet

Penerangan Kod

Sekarang, mari kita teruskan untuk menerangkan kod.

Kaedah paling penting dalam PropertyFinder ialah kaedah cari. Kaedah ini merentasi rantai prototaip objek yang diberikan, mencari sifat yang boleh diakses dan mengembalikannya sebagai senarai.

Kaedah toString dan grep hanya menggunakan find, jadi mereka tidak memerlukan penjelasan lanjut.

Rantaian Prototaip

Rantai prototaip mungkin asing bagi sesetengah orang, tetapi ia adalah warisan sifat daripada kelas Objek.

Warisan dan rantaian prototaip | MDN

Butiran diliputi dalam dokumentasi MDN, tetapi mekanisme pewarisan JavaScript disokong oleh rantai prototaip.

Walaupun ia tidak selalu jelas, apabila merujuk kepada beberapa harta, prosesnya melibatkan:

  1. Menyemak sama ada penerima itu sendiri mempunyai harta.
  2. Menyemak sama ada tika kelas induk mempunyai sifat.
  3. Menyemak sama ada harta itu wujud dalam kelas induk contoh kelas induk.

Proses ini meneruskan rantai sehingga perlawanan ditemui, yang kemudiannya dikembalikan.

Apa yang dilakukan oleh Kaedah Cari

Memandangkan perkara di atas, kaedah cari dalam PropertyFinder melaksanakan mekanisme ini, membolehkan anda mendapatkan senarai sifat dengan meneroka __proto__ secara rekursif.

Berikut ialah pelaksanaan yang mencapai ini dengan meneroka __proto__ secara rekursif untuk mendapatkan senarai:

    find(detect) {
      const list = Object.getOwnPropertyNames(this.receiver).filter(it => detect(it))
      if (!this.receiver.__proto__) {
        return list
      }
      const ancestors = new PropertyFinder(this.receiver.__proto__).find(detect)
      return [...list, ...ancestors]
    }

Itu menyimpulkan penjelasan PropertyFinder.

Bungkus

Itu melengkapkan penjelasan kod dan perkara yang telah saya cuba.

Ini lebih kepada latihan percubaan atau suka bermain, tetapi memandangkan ia melibatkan beberapa pengetahuan dan teknik, saya harap anda mendapati ia berguna atau memberi inspirasi untuk aplikasi anda sendiri.

Atas ialah kandungan terperinci Melaksanakan Kaedah kaedah Ruby dalam JavaScript. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Memahami Ujian Kotak HitamArtikel seterusnya:Memahami Ujian Kotak Hitam