js的模塊化

  衆所周知,js是沒有塊級做用域這一說法的,js只有在函數中定義的變量纔是局部變量,定義在循環,條件語句中的都是全局變量,因此要實現模仿塊級做用域就須要利用js的這一特性,也就是利用閉包,實現局部變量外部沒法調用,只有特權方法才能實現閉包

  參考高級程序設計一書,提供了兩種方法,分別使用於不一樣的場合:函數

一、利用構造函數自己:this

 1 function Text(){
 2               var a = null;
 3               var b =function(){
 4                   alert(a);
 5               };
 6               this.public = function(){
 7                   return a ;
 8               };
 9               this.publicset = function(value){
10                       a = value;
11               };
12           }
13 
14           var c = new Text();
15           c.publicset("11");
16           alert(c.public());
17 
18           var d = new Text();
19           d.publicset("222");
20           alert(c.public());

這裏的a與b分別是局部變量與函數,外部沒法直接調用,經過兩個特權方法進行調用。spa

這裏輸出了兩次c的name值,發現兩次值相同,覺得每新建一個實例,就有對應的一組屬性方法,每一次都是新建的,互不影響。prototype

 

二、靜態私有變量:設計

 1 var text = (function(){
 2                   var a = null;
 3                   var b = function(){
 4                       return a ;
 5                   };
 6 
 7                   var public = function(value){                    //特權方法
 8                   };
 9                   public.prototype.setName = function(value){
10                       a = value;
11                       return this;
12                   };
13                   public.prototype.getName = function(){
14                       return a;
15                   };
16                   return public;                    //返回特權方法,返回給text
17           })();
18 
19           var c = new text();
20           c.setName("ac");
21           alert(c.getName());            //ac
22 
23           var d = new text();
24           d.setName("111");
25           alert(c.getName());            //111

這裏採用了另外一種方法,在內部聲明瞭一個構造函數,並返回這個構造函數(書裏採用建立一個全局構造函數,直接在外部調用這個構造函數的方法),這個構造函數的原型定義特權函數,這樣全部的實例都使用這個特權方法,不會建立新的方法。code

兩次輸出的結果不一致,說明一個實例調用方法會影響其餘實例的靜態變量,這一點要注意。blog

相關文章
相關標籤/搜索