Banyak bahasa pemrograman memiliki mekanisme untuk menyembunyikan, misalnya, metode dan properti kelas. JavaScript tidak memiliki alat bawaan yang memungkinkan, tanpa usaha ekstra, untuk mencapai efek seperti itu. Namun, hal-hal seperti itu dapat ditiru menggunakan fitur bahasa lain.
Bahan, terjemahan yang kami terbitkan hari ini, dikhususkan untuk analisis pola desain "Modul", yang memungkinkan Anda untuk menyembunyikan informasi pribadi di penutupan, memberikan akses hanya ke apa yang diputuskan pengembang untuk dipublikasikan. Artikel ini ditujukan terutama untuk programmer pemula - bagi mereka yang tampaknya terbiasa dengan hal-hal seperti penutupan dan IIFE, tetapi belum menggunakannya dengan sangat percaya diri.
IIFE
Anda dapat mengontrol ruang lingkup variabel dalam JavaScript menggunakan pola "Modul". Untuk membuat ruang lingkup pribadi, Anda dapat menggunakan penutupan. Seperti yang Anda ketahui, fungsi membuat ruang lingkupnya sendiri, yang isinya dipisahkan dari ruang lingkup global:
(function () { // })()
Di depan kita adalah apa yang disebut fungsi self-invoking (
IIFE , Ekspresi Fungsi Segera-dipanggil, segera disebut ekspresi fungsional). Fungsi semacam itu dijalankan segera setelah deklarasi. Lebih mudah menggunakan fungsi-fungsi tersebut untuk menyelesaikan masalah tertentu yang perlu dipecahkan hanya sekali, tanpa meninggalkan sesuatu yang berlebihan dalam lingkup global. Di dalam fungsi ini (serta di dalam fungsi-fungsi lain) ruang lingkup pribadi dibuat, tidak dapat diakses dari luar. Artinya, jika fungsi lain dideklarasikan di dalam lingkup ini, maka setelah IIFE dieksekusi, akses ke sana tidak akan mungkin.
(function () { var myFunction = function () {
Sekarang mari kita coba mengakses fungsi
myFunction
dari teks utama program:
myFunction(); // Uncaught ReferenceError: myFunction is not defined
Seperti yang Anda lihat, seperti yang diharapkan, panggilan ini menyebabkan kesalahan. Ini memberi tahu kami bahwa fungsi ini tidak tersedia dalam ruang lingkup dari mana kami mencoba mengaksesnya. Sebenarnya, tidak ada yang berguna dilakukan dalam dua contoh di atas. Kita membutuhkan contoh-contoh ini hanya untuk mempersiapkan analisis pola “Modul”.
Mengembalikan objek dari modul IIFE dan API
Bagaimana memastikan bahwa suatu fungsi yang dideklarasikan di dalam fungsi lain masih dapat diakses? Sebenarnya, apa yang akan kita bicarakan sekarang adalah pola “Modul”. Perhatikan contoh berikut.
// var Module = (function () { return { myMethod: function () { console.log('myMethod has been called.'); } }; })(); // Module.myMethod();
Anda mungkin memperhatikan bahwa IIFE yang sama digunakan di sini seperti sebelumnya, tetapi sekarang objek dengan metode dikembalikan dari fungsi, yang dapat diakses dari lingkup global. Secara alami, metode ini tidak dapat dipanggil. Perlu dicatat bahwa dalam contoh ini kita tidak menggunakan kemampuan penutupan, kita akan membicarakan ini di bawah.
Objek yang dikembalikan dari IIFE adalah objek biasa yang dapat memiliki banyak metode dan properti. Mereka membentuk antarmuka publik atau API modul.
// var Module = (function () { return { myMethod: function () { }, someOtherMethod: function () { } }; })(); // Module.myMethod(); Module.someOtherMethod();
Variabel pribadi dan fungsi disimpan dalam penutupan
Sekarang saatnya berbicara tentang variabel dan fungsi pribadi. Sebagai contoh, ini dapat berupa beberapa fungsi tambahan yang memastikan pengoperasian mekanisme internal modul.
Ini bisa berupa variabel sementara, atau variabel yang memainkan peran penyimpanan data tertentu, akses yang ingin kita kontrol dengan ketat. Kami tertarik pada modul perangkat semacam itu, ketika hanya apa yang seharusnya tersedia untuk dunia luar, dan semua yang lainnya disembunyikan. Faktanya, segala sesuatu yang, dalam contoh kita, akan dideklarasikan di luar objek yang dikembalikan dari IIFE akan menjadi pribadi.
var Module = (function () { var privateMethod = function () { }; return { publicMethod: function () { } }; })();
Metode
publicMethod
dari contoh ini dapat dipanggil dari luar, tetapi fungsi
privateMethod
tidak
privateMethod
, karena berada dalam ruang lingkup pribadi, dalam penutupan. Justru fungsi-fungsi seperti itu, tidak dapat diakses dari luar, yang dapat memainkan peran mekanisme bantu modul. Mereka dapat digunakan untuk mengelola struktur data internal, untuk membuat beberapa panggilan ke layanan tertentu, dan dalam situasi lain.
Saat bekerja dengan fungsi yang serupa, Anda perlu mempertimbangkan bahwa mereka dapat diakses dari fungsi lain yang dideklarasikan dalam cakupan yang sama, termasuk metode yang dikembalikan dari objek IIFE, dan bahkan setelah perintah
return
dikembalikan yang mengembalikan objek ini . Artinya, metode publik memiliki akses ke fungsi pribadi, mereka dapat berinteraksi dengannya, tetapi dalam lingkup global, fungsi pribadi ini tidak tersedia.
var Module = (function () { var privateMethod = function () { }; return { publicMethod: function () {
Berkat ini, kami dapat melindungi kode dari gangguan yang tidak sah dan melindungi ruang lingkup global dari polusi. Jika ini tidak dilakukan, maka, di satu sisi, pengoperasian mekanisme internal modul dapat secara tidak sengaja atau sengaja terganggu, karena fakta bahwa kode eksternal mengacu pada fungsi atau variabel yang tidak boleh diakses. Di sisi lain, jika Anda tidak menggunakan pendekatan yang dijelaskan di sini, banyak hal yang tidak perlu termasuk dalam ruang lingkup global, yang, misalnya, dapat menyebabkan konflik nama.
Berikut adalah contoh objek yang dikembalikan dari IIFE yang berisi metode publik dan dapat mengakses fungsi pribadi:
var Module = (function () { var myModule = {}; var privateMethod = function () { }; myModule.publicMethod = function () { }; myModule.anotherPublicMethod = function () { }; return myModule;
Penamaan fitur pribadi dan publik
Ada satu perjanjian, yang menurutnya di awal nama-nama fungsi pribadi menggarisbawahi. Ini memungkinkan, hanya dengan melihat kode, untuk memahami fungsi mana yang internal dan yang tersedia untuk umum. Misalnya, mungkin terlihat seperti ini:
var Module = (function () { var _privateMethod = function () { }; var publicMethod = function () { }; return { publicMethod: publicMethod, } })();
Ringkasan
Dalam artikel ini, kami memeriksa pola "Modul" sederhana, yang, melalui penggunaan penutupan yang dibentuk oleh ekspresi fungsional yang segera dipanggil dan dikembalikan dari ekspresi objek, memungkinkan Anda untuk membuat metode publik dan fungsi pribadi dan struktur data yang tidak dapat langsung dioperasikan dari luar. Template ini memungkinkan Anda untuk menyembunyikan detail implementasi modul, melindunginya dari perubahan yang tidak disengaja atau disengaja, dan membantu menjaga ruang lingkup global tetap bersih.
Pembaca yang budiman! Apakah Anda menggunakan pola "Modul" di proyek JS Anda?
