Rumah  >  Artikel  >  hujung hadapan web  >  Berkongsi pelaksanaan mod tunggal dalam kemahiran JavaScript_javascript

Berkongsi pelaksanaan mod tunggal dalam kemahiran JavaScript_javascript

WBOY
WBOYasal
2016-05-16 16:17:13837semak imbas

Mod tunggal sebagai model pembangunan perisian telah digunakan secara meluas dalam banyak bahasa berorientasikan objek Dalam JavaScript, mod tunggal juga digunakan secara meluas Walau bagaimanapun, kerana bahasa JavaScript mempunyai pendekatan berorientasikan objek yang unik, menghasilkan Walaupun ia konsisten dengan beberapa bahasa berorientasikan objek tradisional dalam idea mod tunggal, masih terdapat perbezaan dalam pelaksanaan.

Pertama, mari kita lihat definisi corak tunggal dalam bahasa berorientasikan objek tradisional: Corak Singleton ialah kelas yang hanya boleh digunakan sekali dan boleh diakses melalui pusat akses yang terkenal. Terdapat dua perkara dalam definisi ini yang menonjolkan ciri-ciri bahasa berorientasikan objek tradisional, iaitu kelas dan instantiasi Oleh itu, bagi bahasa berorientasikan objek tradisional, mod tunggal adalah berdasarkan ciri semula jadi kelas dan instantiasi, iaitu. menggunakan kekunci Kelas perkataan mentakrifkan kelas, yang boleh dijadikan instantiated melalui kata kunci baharu, tetapi ia perlu dipastikan bahawa contoh yang sama diperolehi setiap kali ia dijadikan instantiated oleh baharu, atau pembinanya hanya boleh dipanggil sekali melalui baharu.

Mari kita lihat definisi mod tunggal dalam JavaScript: Tunggal ialah objek yang digunakan untuk membahagikan ruang nama dan menyusun sekumpulan kaedah dan sifat yang berkaitan bersama-sama sekali. Membandingkan definisi di atas, anda akan mendapati bahawa definisi tunggal di sini pada dasarnya mentakrifkannya sebagai objek, bukannya kelas dalam bahasa berorientasikan objek tradisional Ini juga menunjukkan bahawa bahasa JavaScript adalah berdasarkan objek. Pada masa yang sama, ia telah dinyatakan kemudian bahawa jika ia boleh dijadikan instantiated, ini menunjukkan bahawa perlu ada beberapa cara untuk mentakrifkan satu objek dalam JavaScript Terdapat satu atau beberapa cara untuk mencipta satu objek dengan menggunakan kata kunci baharu. Walau bagaimanapun, kaedah ini bukanlah ciri semula jadi JavaScript itu sendiri, kerana objek yang dicipta menggunakan kata kunci baharu sebenarnya menggunakan fungsi untuk mensimulasikan definisi pembinanya (walaupun ES6 telah mula menyokong kata kunci kelas, ia belum lagi dilihat (Disokong secara meluas oleh semua pelayar)), jadi bagaimana untuk menggunakan ciri semula jadi JavaScript untuk melaksanakan mod tunggal?

var Singleton={
  attribute1:true,
  attribute2:10,
  method1:function(){

  },
  method2:function(arg){

  }
}

Objek Singleton ditakrifkan di sini, yang mengandungi beberapa sifat dan kaedah Ia disertakan dalam halaman dimuatkan dan proses penghuraian dan pelaksanaan js selesai, kami tidak menggunakan kata kunci baharu untuk membuat seketika objek ini. Ini juga merupakan perbezaan besar antara pelaksanaan mod tunggal dalam JavaScript dan bahasa berorientasikan objek tradisional. Cara ini lebih ringkas dan mudah difahami. Walau bagaimanapun, kaedah ini mempunyai beberapa kelemahan Satu kelemahan yang jelas ialah ia tidak menyediakan ruang nama Jika pengaturcara lain juga menentukan pembolehubah Singleton dalam halaman, ia adalah mudah untuk menulis semula dan mengelirukan objek tunggal, jadi untuk menyelesaikan masalah ini, tulis semula. ia seperti berikut:

var mySpace={};
mySpace.Singleton={
  attribute1:true,
  attribute2:10,
  method1:function(){

  },
  method2:function(arg){

  }
}


Di sini kita mula-mula mentakrifkan ruang nama mySpace, dan kemudian melekapkan objek Singleton di bawah objek ini. Ini sangat mengurangkan kemungkinan konflik dan salah operasi dengan pengaturcara lain, walaupun yang lain berada dalam skop global objek tunggal ini mencapai fungsi membahagikan ruang nama dan mengatur beberapa sifat dan kaedah yang berkaitan bersama-sama seperti yang dinyatakan dalam definisi sebelumnya.

Kaedah ini masih mempunyai kekurangan Semua sifat dan kaedah objek tunggal ini adalah biasa dan boleh diakses dan diubah suai oleh luar pada bila-bila masa Oleh itu, penutupan digunakan untuk mensimulasikan sifat dan kaedah peribadi, seperti 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];
    privateMethod2();
  }

  }

})();


Di sini kami secara langsung menetapkan fungsi laksana sendiri tanpa nama kepada objek tunggal Dalam fungsi ini, kami menggunakan kata kunci var dan fungsi untuk masing-masing mentakrifkan sifat peribadi dan kaedah ini tidak boleh diakses secara langsung di luar fungsi tersebut. Boleh diakses, kerana sebaik sahaja fungsi itu dilaksanakan, ruang dalam skop dalamannya akan dituntut semula, itulah sebabnya penutupan boleh digunakan untuk mensimulasikan sifat dan kaedah persendirian. Dalam fungsi ini (penutupan), objek akhirnya dikembalikan Objek ini mengandungi beberapa kaedah dan sifat awam, yang boleh dipanggil terus dari luar Pada masa yang sama, kerana kaedah awam ini ditakrifkan di dalam fungsi, sifat peribadi dan kaedah boleh dipanggil Walau bagaimanapun, dunia luar hanya boleh menyelesaikan operasi tertentu melalui kaedah dan sifat awam yang dikembalikan, dan tidak boleh memanggil sifat Singleton.privateMethod1 secara langsung. Ini membolehkan objek tunggal bukan sahaja mengasingkan dunia luar daripada mengakses terus sifat dan kaedah peribadinya, tetapi juga menyediakan beberapa sifat dan kaedah biasa kepada dunia luar untuk menyelesaikan operasi tertentu.

Mod tunggal yang dibina oleh pelaksanaan sendiri fungsi tanpa nama digunakan secara meluas dalam banyak perpustakaan js, tetapi masih terdapat masalah Jika kita tidak perlu menggunakan objek semasa memuatkan halaman, dan objek Apabila ia mahal buat (seperti memerlukan banyak pengiraan atau berbilang akses kepada pepohon DOM dan sifatnya, dsb.), pendekatan yang munasabah adalah untuk menciptanya apabila anda memerlukannya, dan bukannya menciptanya secara langsung dengan penghuraian dan pelaksanaan js Konsep ini dipanggil lazy loading, jadi kod di atas diubah suai seperti 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;
          privateMethod1();
        },
        publicMethod2:function(arg){
          privateAttribute1=[4,5,6];
          privateMethod2();
        }

      }
    }

    return {
      getInstance:function(){
       if(!uniqueInstance){
         uniqueInstance=constructor();
       }
        return uniqueInstance;
      }
    }

  })();

Di sini kita mula-mula mentakrifkan pembolehubah peribadi uniqueInstance dalam fungsi tanpa nama sebagai pemegang untuk menentukan sama ada objek tunggal telah dicipta, dan kemudian meletakkan semua sifat dan kaedah yang baru ditakrifkan untuk objek tunggal ke dalam fungsi, objek tunggal akan dibuat hanya apabila fungsi dipanggil, jika tidak, ia tidak akan dibuat secara langsung. Kemudian, objek dikembalikan, yang mengandungi kaedah getInstance Kaedah ini adalah untuk panggilan luaran, mula-mula tentukan sama ada objek tunggal itu wujud objek tunggal kembali kepadanya. Akhir sekali, jika kita memanggil kaedah objek tunggal, kita perlu menggunakan mySpace.Singleton.getInstance().publicMethod1(Di sini, objek tunggal akan dibuat hanya apabila kita memanggilnya seperti ini, jika tidak, objek tunggal tidak akan). akan dibuat secara automatik, yang sebenarnya melaksanakan pemuatan atas permintaan atau pemuatan malas.

Kenyataan:
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