Pertanyaan Cara menggunakan Mengungkap pola modul dalam JavaScript


Saya sengaja menemukan posting ini: Pola Modul Mengungkap JavaScript. Saya ingin menggunakan ini dalam proyek saya.

Mari kita bayangkan saya punya fungsi abc dan saya memanggil fungsi itu dalam file JavaScript utama saya.

Apakah pola ini membuat semuanya berbeda? Adakah yang bisa menunjukkan saya contoh dasar dari pola ini?


75
2018-04-13 09:46


asal


Jawaban:


Contoh kecil:

var revealed = function(){
   var a = [1,2,3];
   function abc(){
     return (a[0]*a[1])+a[2];
   }

   return {
      name: 'revealed',
      abcfn: abc
   }
}();

dalam fungsi anonim yang dimulai untuk memberi revealed sebuah nilai, a dan abc bersifat pribadi untuk fungsi itu. Apa yang dikembalikan fungsi adalah literal objek dengan name milik dan a abcfn properti, yang merupakan referensi ke abc function. Itu abc function menggunakan variabel pribadi a. Ini semua bisa dilakukan berkat penggunaan penutupan (semua yang ada dalam lingkup fungsi dapat dirujuk oleh yang lainnya dalam fungsi yang sama).

Penggunaan yang diungkapkan:

alert(revealed.name);    //=> 'revealed'
alert(revealed.abcfn()); //=> 5 (1*2+3)

95
2018-04-13 10:00



DC = Douglas Crockford
    RMP = Mengungkap Pola Modul

Perbedaan antara DC dan RMP terutama organisasi / dapat dibaca

Contoh disajikan dalam artikel itu sendiri? Dan apa sebenarnya yang Anda tanyakan karena hal-hal itu tidak ada kaitannya dengan file tetapi lebih kepada penutupan.

Anda meletakkan segala sesuatu dalam sebuah penutupan (fungsi) dan hanya mengekspos bagian yang Anda ingin dapat diakses. Perbedaan antara gaya DC dan RMP adalah bahwa dalam fungsi pertama didefinisikan di tempat yang berbeda sementara di RMP mereka selalu didefinisikan di tempat yang sama dan kemudian setelah itu mengungkapkan dalam publik objek literal.

Jadi di DC dan RMP Anda memiliki:

  • penutupan yang memungkinkan untuk menentukan bagian-bagian pribadi (variabel dan fungsi)
  • bagian pribadi
  • hasil publik yang mendefinisikan fungsionalitas dan variabel yang dapat dilihat publik (negara bagian)

Kedua pola ini hanya berbeda dalam hal keterbacaan. Dalam kasus DC Anda tidak dapat selalu tahu di mana fungsi tertentu akan ditentukan, tetapi dalam RMP Anda selalu tahu semuanya ada di bagian pribadi.


22
2018-04-13 09:55



Mengungkap pola modul dijelaskan cukup bagus di Pola Desain JavaScript Penting Untuk Pemula artikel.


13
2018-04-13 09:53



Metode yang disebut oleh penulis "pola Douglas Crockford untuk membuat objek" sebenarnya adalah pola modul yang dikembangkan sebagian besar oleh Richard Cornford et al. Lihat http://groups.google.com/group/comp.lang.javascript/msg/9f58bd11bd67d937 

Seperti contohnya, ada banyak. Baca artikel berikut dan ikuti beberapa tautan: http://peter.michaux.ca/articles/module-pattern-provides-no-privacy-at-least-not-in-javascript-tm


6
2018-04-13 10:01



Saya suka menggunakan campuran mengungkapkan pola modul dengan pola tunggal sehingga saya dapat menyimpan kode terstruktur dengan manfaat dari pola modul:

var MyFunction = function(){

    var _ = {
       Init: function(){
          _.Config.foo = "hello world";
       },
       Config:{
          foo:null
       },
       ShowAlert:function(){
          alert(_.Config.foo);
       }
    }

    return {
        Init: _.Init,
        ShowAlert: _.ShowAlert
    };
}();

MyFunction.Init();
MyFunction.ShowAlert();

Saya telah menulis lebih banyak informasi tentang ini di blog saya:

http://curtistimson.co.uk/js/mixing-revealing-module-and-singleton-javascript-patterns/


1
2018-06-22 12:30



Untuk kode di luar modul, itu membuat sedikit perbedaan. Dalam semua 3 kasus dalam artikel itu, metode disebut dengan cara yang sama. Tetapi struktur modul itu sendiri secara internal berbeda.

Pola modul Crockford dan apa yang mereka sebut "pola modul pengungkapan" adalah hal yang sama, secara struktural. Satu-satunya perbedaan adalah bahwa mereka menetapkan metode ke var lokal terlebih dahulu agar lebih mudah dibaca. Tetapi sebenarnya tidak ada yang istimewa tentang itu, dan Anda memiliki beberapa contoh di sana di tautan Anda.


0
2018-04-13 09:54



Konsep dasar dari Modul Mengungkap adalah bahwa Anda memiliki Object yang merangkum data dan tingkah lakunya:

var Module = (function(){
    var privateStuff = {};
    var publicStuff = {};

    return publicStuff;
})();

Namun, ada beberapa praktik terbaik yang harus Anda terapkan saat menggunakan pola ini. Inilah modulnya ("Modulus") dengan beberapa properti demi demonstrasi, yang menggunakan beberapa praktik ini:

function AbstractSomeClass(id) {
    this.id = id;
    return this;
}

var Modulus = (new (function SomeClass() {
    var thus = this;

    function NameClass(name){
        this.value = thus.name || name;
    }

    AbstractSomeClass.call(this, 998);

    this.name = 'Touring';
    this.name = ( new NameClass('Hofstadter') ).value;

    return {
        id: this.id,
        name: this.name
    };
})());

Perhatikan (new (function SomeClass(){ ... })()); sintaksis. Menggunakan new seperti ini memungkinkan Anda untuk menggunakan this kata kunci dalam dari penutupan. Ini berguna jika Anda perlu mewarisi properti dari kelas lain (AbstractSomeClass.call(this, 998);) - Namun, Anda masih perlu melakukannya mengungkapkan properti yang ingin Anda publikasikan, misalnya:

return {
    id: this.id,
    name: this.name
};

Perhatikan juga bahwa kami menetapkan this untuk thus - yang memungkinkan kita untuk menggunakan Induk-this di dalam subclass yang memiliki miliknya sendiri this ruang lingkup (this.value = thus.name || name;)

Sekali lagi, ini hanyalah beberapa konvensi dan praktik terbaik yang disarankan.


0
2017-08-15 20:49