2011-09-24 10 views
8

Voglio scrivere una libreria JS e gestire in questo modo:Scrivi libreria JavaScript

var c1 = Module.Class(); 
c1.init(); 
var c1 = Module.Class(); 
c2.init(); 

E, naturalmente, C1 e C2 non può condividere le stesse variabili. Credo di sapere come fare questo con gli oggetti, sarebbe:

var Module = { 

    Class = { 

     init = function(){ 
      ... 
     } 

    } 

} 

Ma il problema è che non posso avere più istanze di classe se scrivo in questo modo. Quindi sto cercando di ottenere lo stesso risultato con la funzione, ma non penso che lo stia facendo bene.

(function() { 

    var Module; 
    window.Module = Module = {}; 

    function Class(i) { 
     //How can "this" refer to Class instead of Module? 
     this.initial = i; 
    } 

    Class.prototype.execute = function() { 
     ... 
    } 

    //Public 
    Module.Class = Class; 

})(); 

Non ho la minima idea se è possibile, ma accetto suggerimenti di altro modo per creare questo modulo. Non so se è rilevante anche, ma sto usando jQuery all'interno di questa libreria.

risposta

14

Usage:

var c1 = Module.Class("c"); 
var c2 = Module.Class("a"); 
var n = c1.initial(); // equals 'c' 
c1.initial("s"); 
n = c1.initial(); // equals 's' 

Codice Modulo:

(function(window) { 
    var Module = window.Module = {}; 
    var Class = Module.Class = function(initial) 
    { 
     return new Module.Class.fn.init(initial); 
    }; 
    Class.fn = Class.prototype = { 
     init: function(initial) { 
      this._initial = initial; 
     }, 
     initial: function(v){ 
      if (v !== undefined) { 
       this._initial = v; 
       return this; 
      } 
      return this._initial; 
     } 
    }; 
    Class.fn.init.prototype = Class.fn; 
})(window || this); 

Questo sta usando il "Modulo" Design Pattern JavaScript; che è lo stesso modello di progettazione utilizzato dalle librerie JavaScript come jQuery.

Ecco un bel tutorial sul modello "Modulo": JavaScript Module Pattern: In-Depth

+1

Perfetto! Grazie mille! –

+2

prego. –