Memperluas Fungsi dengan Kelas ES6
Dalam ES6, pengaturcara mempunyai keupayaan untuk memanjangkan objek khas, termasuk fungsi. Dengan menggunakan warisan, ia menjadi mungkin untuk memperoleh kelas daripada fungsi. Walaupun objek lanjutan ini boleh digunakan seperti fungsi, melaksanakan logik yang sesuai untuk panggilan ini boleh menimbulkan cabaran.
Satu persoalan penting timbul dalam senario ini: bagaimana untuk mendapatkan rujukan kepada contoh kelas apabila objek dipanggil sebagai fungsi, memandangkan kaedah biasa mendapat akses melalui ini? Malangnya, rujukan ini menunjuk kepada objek global (tetingkap) dalam kes ini.
Penyelesaian:
Untuk menangani isu ini, seseorang boleh menggunakan konsep penutupan, dengan itu mencipta fungsi dikembalikan yang merangkum akses kepada pembolehubah contoh. Berikut ialah ilustrasi:
class Smth extends Function { constructor(x) { super(() => { return x; }); } }
Dalam contoh ini, ungkapan super dalam pembina memulakan pembina fungsi, memerlukan rentetan yang mewakili kod untuk dilaksanakan. Walau bagaimanapun, mengakses data contoh adalah tidak mudah, jadi pendekatan berkod keras diguna pakai, menghasilkan hasil yang diinginkan:
console.log((new Smth(256))()); // Logs: 256
Pendekatan alternatif untuk mencapai objektif yang sama melibatkan memanipulasi rantai prototaip:
class Smth extends Function { constructor(x) { const smth = function() { return x; }; Object.setPrototypeOf(smth, Smth.prototype); return smth; } }
Kaedah ini menawarkan fleksibiliti yang lebih besar dengan membenarkan fungsi yang dikembalikan menjadi penutup yang mampu mengakses pembolehubah contoh.
Selain itu, adalah mungkin untuk mengabstraksikan fungsi ini kepada utiliti yang boleh digunakan semula:
class ExtensibleFunction extends Function { constructor(f) { return Object.setPrototypeOf(f, new.target.prototype); } } class Smth extends ExtensibleFunction { constructor(x) { super(() => { return x; }); } }
Pendekatan ini mewujudkan tahap penyimpangan tambahan dalam hierarki warisan, tetapi ia boleh memberi manfaat dalam senario tertentu. Selain itu, seseorang boleh mengelakkan perkara ini dengan menggunakan binaan berikut:
function ExtensibleFunction(f) { return Object.setPrototypeOf(f, new.target.prototype); } ExtensibleFunction.prototype = Function.prototype;
Sila ambil perhatian, walau bagaimanapun, Smth tidak akan mewarisi sifat Fungsi statik secara dinamik dalam kes ini.
Atas ialah kandungan terperinci Cara Mengakses Instance Kelas daripada Invocation Fungsi apabila Memanjangkan Fungsi dengan Kelas ES6. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!