Cara Mengakses Instance Kelas daripada Invocation Fungsi apabila Memanjangkan Fungsi dengan Kelas ES6

Linda Hamilton
Lepaskan: 2024-10-21 06:03:30
asal
632 orang telah melayarinya

How to Access Class Instance from Function Invocation when Extending Functions with ES6 Classes

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; });
  }
}
Salin selepas log masuk

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
Salin selepas log masuk

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;
  }
}
Salin selepas log masuk

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; });
  }
}
Salin selepas log masuk

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;
Salin selepas log masuk

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!

sumber:php
Kenyataan Laman Web ini
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 terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!