Sebagai model pengembangan perangkat lunak, pola monolitik telah banyak digunakan dalam banyak bahasa yang berorientasi objek. Dalam JavaScript, pola monolitik juga banyak digunakan. Namun, karena bahasa JavaScript memiliki metode berorientasi objek yang unik, ia konsisten dengan beberapa bahasa berorientasi objek tradisional, tetapi masih berbeda dalam implementasi.
Pertama, mari kita lihat definisi pola monomer dalam bahasa tradisional yang berorientasi objek: pola monomer adalah kelas yang hanya dapat dipakai sekali dan dapat diakses melalui titik akses yang terkenal. Ada dua poin dalam definisi ini yang menyoroti karakteristik bahasa tradisional yang berorientasi objek, yaitu kelas dan instantiasi. Oleh karena itu, untuk bahasa tradisional yang berorientasi objek, pola monolitik didasarkan pada karakteristik alami dari kelas dan instantiasi. Artinya, gunakan kelas kata kunci untuk mendefinisikan kelas, yang dapat dipakai melalui kata kunci baru, tetapi perlu dipastikan bahwa setiap kali dipakai oleh baru, contoh yang sama diperoleh atau bahwa konstruktornya hanya dapat dipanggil sekali melalui yang baru.
Mari kita lihat definisi pola monomer dalam JavaScript: Monomer adalah objek yang digunakan untuk membagi namespace dan mengatur batch metode dan atribut terkait bersama -sama. Jika dapat dipakai, itu hanya dapat dipakai sekali. Membandingkan definisi di atas, Anda akan menemukan bahwa definisi monomer di sini mendefinisikan esensinya sebagai objek, bukan kelas dalam bahasa berorientasi objek tradisional, yang juga menunjukkan bahwa bahasa JavaScript berbasis objek. Pada saat yang sama, ditunjukkan kemudian bahwa jika dapat dipakai, ini menunjukkan bahwa harus ada beberapa cara untuk mendefinisikan monomer dalam JavaScript. Ada satu atau lebih cara untuk membuat instantiate yang dapat dipakai, yaitu, gunakan kata kunci baru untuk membuat objek monomer. Namun, metode ini bukan fitur alami dari JavaScript itu sendiri, karena objek yang dibuat menggunakan kata kunci baru sebenarnya disimulasikan dan didefinisikan melalui fungsi (meskipun ES6 telah mulai mendukung kata kunci kelas, belum banyak didukung oleh browser). Jadi bagaimana cara menggunakan fitur alami JavaScript untuk mengimplementasikan pola monomer?
var singleton = {attribute1: true, attribute2: 10, method1: function () {}, method2: function (arg) {}}Berikut adalah objek singleton, yang berisi beberapa properti dan metode. Itu termasuk dalam halaman. Objek ini dibuat saat JS dimuat. Ini disebut menggunakan singleton.method1 saat menelepon. Instantiasi selesai selama pelaksanaan halaman memuat parsing JS. Kami tidak menggunakan kata kunci baru untuk instantiate objek ini. Ini juga merupakan perbedaan besar antara menerapkan pola monolitik dalam JavaScript dan bahasa berorientasi objek tradisional. Metode ini lebih sederhana dan lebih mudah dipahami. Namun, metode ini memiliki beberapa kelemahan. Salah satu kerugian yang jelas adalah tidak menyediakan namespace. Jika programmer lain juga mendefinisikan variabel singleton di halaman, mudah untuk menimpa dan membingungkan objek monolitik. Jadi untuk masalah ini, ditulis ulang sebagai berikut:
var myspace = {}; myspace.singleton = {attribute1: true, attribute2: 10, method1: function () {}, method2: function (arg) {}}Di sini, namespace myspace didefinisikan terlebih dahulu, dan kemudian objek tunggal singleton dipasang di bawah objek ini, yang sangat mengurangi kemungkinan konflik dengan programmer dan kesalahan operasi lain. Bahkan jika orang lain mendefinisikan variabel singleton dalam ruang lingkup global, itu tidak akan mencemari objek singleton. Ini mengimplementasikan fungsi membagi namespace dan mengatur beberapa atribut dan metode terkait seperti yang disebutkan dalam definisi sebelumnya.
Metode ini masih memiliki kelemahannya. Semua properti dan metode objek monolitik ini dibagikan dan dapat diakses dan dimodifikasi kapan saja dari luar. Oleh karena itu, penutupan digunakan untuk mensimulasikan properti dan metode pribadi, sebagai berikut:
mySpace.Singleton=(function(){ var privateAttribute1=false; var privateAttribute1=[1,2,3]; function privateMethod1(){ } function privateMethod2(){ } return { publicAttribute1:true, publicAttribute2:10, publicMethod1:function(){ privateAttribute1=true; privateMethod1(); }, publicmethod2: function (arg) {privateAttribute1 = [4,5,6];Di sini kami secara langsung menetapkan fungsi pengukuhan diri anonim ke objek Monolith. Dalam fungsi ini, kata kunci VAR dan fungsi digunakan untuk menentukan properti dan metode pribadinya masing -masing. Ini tidak dapat diakses secara langsung di luar fungsi (di luar objek monolith), karena begitu fungsi dieksekusi, ruang ruang lingkup internalnya akan didaur ulang, itulah sebabnya penutupan dapat digunakan untuk mensimulasikan properti dan metode pribadi. Dalam fungsi ini (penutupan), suatu objek akhirnya dikembalikan, yang berisi beberapa metode dan properti publik, yang dapat dipanggil langsung di luar. Pada saat yang sama, karena metode publik ini didefinisikan di dalam fungsi, mereka dapat memanggil properti dan metode pribadi mereka. Namun, dunia luar hanya dapat menyelesaikan operasi tertentu melalui metode dan properti publik yang dikembalikan, dan tidak dapat secara langsung memanggil properti seperti singleton.privatemethod1. Ini membuat objek monolitik tidak hanya mengisolasi dunia luar untuk secara langsung mengakses properti dan metode pribadinya, tetapi juga menyediakan beberapa sifat dan metode umum ke dunia luar untuk menyelesaikan operasi tertentu.
Pola monolitik yang dibangun oleh eksekusi fungsi anonim ini banyak digunakan di banyak perpustakaan JS, tetapi masih ada masalah. Jika kita tidak perlu menggunakan objek saat memuat halaman, dan pembuatan objek lebih mahal (seperti banyak perhitungan atau beberapa akses ke pohon DOM dan propertinya, dll.), Adalah masuk akal untuk membuatnya ketika diperlukan, daripada secara langsung membuatnya dengan penguraian dan pelaksanaan JS. Konsep ini disebut Lazy Loading, jadi modifikasi kode di atas sebagai berikut:
mySpace.Singleton=(function(){ var uniqueInstance; function constructor(){ var privateAttribute1=false; var privateAttribute1=[1,2,3]; function privateMethod1(){ } function privateMethod2(){ } return { publicAttribute1:true, publicAttribute2:10, publicMethod1:function(){ PrivateAttribute1 = true;Di sini, variabel pribadi unikinstance didefinisikan dalam fungsi anonim sebagai pegangan untuk menentukan apakah objek monolitik telah dibuat. Kemudian, semua atribut dan metode yang ditentukan untuk objek monolitik telah ditempatkan dalam fungsi yang disebut konstruktor. Hanya ketika fungsi dipanggil dapatkah objek monolitik dibuat, jika tidak, ia tidak akan dibuat secara langsung. Kemudian, kembalikan suatu objek, yang berisi metode getInstance, yang untuk panggilan eksternal. Saat memanggil metode ini, pertama -tama tentukan apakah ada objek monolitik. Jika ada, kembalikan langsung. Jika tidak, hubungi fungsi konstruktor untuk membangun objek monolitik dan mengembalikannya. Akhirnya, jika kita memanggil metode objek monolitik, kita perlu menggunakan myspace.singleton.getInstance (). Publicmethod1 (). Di sini, kita hanya akan membuat objek monolitik ini ketika kita menyebutnya dengan cara ini, jika tidak objek monolitik tidak akan dibuat secara otomatis, yang sebenarnya mengimplementasikan pemuatan sesuai permintaan atau pemuatan malas.