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.
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.
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']
*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
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.
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:
Proses ini meneruskan rantai sehingga perlawanan ditemui, yang kemudiannya dikembalikan.
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.
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!