2011-09-27 34 views
1

我正在編寫一個JavaScript庫,其中我想要一些方法和屬性public和other private。以下內容似乎是一個很好的方法,同時將所有內容都包裝到單個對象中。在JavaScript靜態實例上使用構造函數

(function (window) { 
    var Thing = function() { 
     // private var 
     var variable = "value"; 

     return { 
     // public method 
     method:function() { 
      alert(variable); 
     } 
     } 
    }(); 

    window.Thing = Thing; 

})(window); 

Thing.method(); 

這很好。 (主要從here抓起)。

但是,我仍然希望能夠使用Thing的構造函數傳遞一些參數。

有無論如何我可以在return語句中提供構造函數,或者使用prototype來覆蓋構造函數嗎?所以,我可以打電話:

Thing(stuff); 

現在,如果我嘗試,它會導致:

Uncaught TypeError: Property 'Thing' of object [object DOMWindow] is not a function 

這是有道理的,因爲它不是返回本身,而是理想。我希望能夠調用構造函數。

或者,這是否只是baaaad,我應該避開一些或全部?

回答

1

要完成你的要求,做這樣的事情:

(function (window) { 
    var thingMaker= function(stuff) { 
     // private var 
     var variable = "value"; 

     return { 
     // public method 
     method:function() { 
      alert(variable); 
     } 
     alertStuff:function() { 
      alert(stuff); 
     } 
     } 
    }; 

    window.thingMaker= thingMaker; 

})(window); 

var myThing = window.thingMaker(stuff); 
myThing.alertStuff() 

更多的信息可以通過搜索道格拉斯克羅克福德的googlenets被發現。他提供的一些很棒且非常豐富的視頻可在yui theater上找到。但我不得不問,爲什麼創建另一個框架,當那裏已經有很多偉大的(jquery,prototype,yui,dojo等等)

+0

這是最接近我所希望的答案,謝謝。不過,我仍然真的希望能夠靜態訪問方法,而不是將對象分配給變量。最後,我決定不採用問題中的方法,而是將匿名函數保留在內部,而不是包裹在對象Thing中。 – bdls

0

Thing已經創建好了,所以你總是會爲調用'構造函數'太遲了。

您可以傳遞變量是這樣的:

(function (window, var1, var2) { 
    var Thing = function() { 
    // private var 
    var variable = "value"; 

    return { 
    // public method 
    method:function() { 
     alert(variable); 
    } 
    } 
}(); 
window.Thing = Thing; 
})(window, var1, var2); 
0

ThingObject有一個方法叫method

{ 
    // public method 
    method:function() { 
     alert(variable); 
    } 
    } 

Thing.method(); // alerts "value" 

你可以返回來代替:

function() { 
    alert(arguments) 
} 

然後

Thing(6,5,4); // alerts 6,5,4