Pola Modul awalnya didefinisikan sebagai cara untuk menyediakan enkapsulasi pribadi dan publik untuk kelas dalam rekayasa perangkat lunak konvensional.
Ketika bekerja dengan pola Module, kita mungkin menemukan manfaat untuk mendefinisikan template sederhana yang kita gunakan untuk memulainya. Berikut ini salah satu yang mencakup spasi nama, variabel publik dan pribadi.
Dalam JavaScript, pola Module digunakan untuk lebih meniru konsep kelas sedemikian rupa sehingga kami dapat memasukkan metode publik / pribadi dan variabel di dalam objek tunggal, sehingga melindungi bagian-bagian tertentu dari lingkup global. Hasilnya adalah pengurangan kemungkinan nama fungsi kami bertentangan dengan fungsi lain yang didefinisikan dalam skrip tambahan pada halaman.
var myNamespace = (function () {
var myPrivateVar, myPrivateMethod;
// A private counter variable
myPrivateVar = 0;
// A private function which logs any arguments
myPrivateMethod = function( foo ) {
console.log( foo );
};
return {
// A public variable
myPublicVar: "foo",
// A public function utilizing privates
myPublicFunction: function( bar ) {
// Increment our private counter
myPrivateVar++;
// Call our private method using bar
myPrivateMethod( bar );
}
};
})();
Keuntungan
mengapa pola Modul merupakan pilihan yang baik? Sebagai permulaan, ini jauh lebih bersih bagi pengembang yang datang dari latar belakang berorientasi objek daripada gagasan enkapsulasi sejati, setidaknya dari perspektif JavaScript.
Kedua, ini mendukung data pribadi - jadi, dalam pola Modul, bagian publik dari kode kami dapat menyentuh bagian pribadi, namun dunia luar tidak dapat menyentuh bagian pribadi kelas.
Kekurangan
Kerugian dari pola Modul adalah ketika kita mengakses anggota publik dan swasta secara berbeda, ketika kita ingin mengubah visibilitas, kita sebenarnya harus membuat perubahan di setiap tempat anggota itu digunakan.
Kami juga tidak dapat mengakses anggota pribadi dalam metode yang ditambahkan ke objek di kemudian hari . Yang mengatakan, dalam banyak kasus, pola Modul masih cukup berguna dan ketika digunakan dengan benar, tentu memiliki potensi untuk meningkatkan struktur aplikasi kita.
Pola Penyingkapan Modul
Sekarang kita sedikit lebih terbiasa dengan pola modul, mari kita lihat versi yang sedikit lebih baik - pola Revealing Module milik Christian Heilmann.
Pola Revealing Module muncul ketika Heilmann frustrasi dengan fakta bahwa ia harus mengulangi nama objek utama ketika kami ingin memanggil satu metode publik dari yang lain atau mengakses variabel publik. Ia juga tidak menyukai persyaratan pola Modul karena harus beralih untuk menolak notasi literal untuk hal-hal yang ingin dipublikasikan.
Hasil dari usahanya adalah pola yang diperbarui di mana kami hanya akan mendefinisikan semua fungsi dan variabel kami dalam lingkup pribadi dan mengembalikan objek anonim dengan petunjuk ke fungsi pribadi yang ingin kami ungkapkan sebagai publik.
Contoh cara menggunakan pola Modul Penyingkapan dapat ditemukan di bawah
var myRevealingModule = (function () {
var privateVar = "Ben Cherry",
publicVar = "Hey there!";
function privateFunction() {
console.log( "Name:" + privateVar );
}
function publicSetName( strName ) {
privateVar = strName;
}
function publicGetName() {
privateFunction();
}
// Reveal public pointers to
// private functions and properties
return {
setName: publicSetName,
greeting: publicVar,
getName: publicGetName
};
})();
myRevealingModule.setName( "Paul Kinlan" );
Keuntungan
Pola ini memungkinkan sintaks skrip kami menjadi lebih konsisten. Itu juga membuatnya lebih jelas di akhir modul mana dari fungsi dan variabel kita dapat diakses secara publik yang memudahkan keterbacaan.
Kekurangan
Kerugian dari pola ini adalah bahwa jika fungsi privat mengacu pada fungsi publik, fungsi publik itu tidak dapat diganti jika tambalan diperlukan. Ini karena fungsi privat akan terus merujuk pada implementasi privat dan polanya tidak berlaku untuk anggota publik, hanya untuk fungsi.
Anggota objek publik yang merujuk ke variabel pribadi juga tunduk pada catatan aturan no-patch di atas.