import Biz.User; User u = new User(); u.show();
按流程就是導包、實例化、調用。
Using("User"); var u = new User(); u.show();
那么,在JS里面可以實現嗎?
Using("User");
為什么用Using,當然只是我的一個命名想法而已,可以聯想一下C#,用的就是using,借來而已。
var u = new User(); u.show();
很正常,就是很平常的實例化與函數調用,唯一不解的是User對象哪里來的?那么當然是第一句導包的時候導入的。
Using("User");
相當於寫了一句
<script type="text/javascript" src="user.js"></script>
現在這么看下來,這么做有意義嗎?就為把script標簽寫成JS動態引入的?或者,只為少寫幾個字符?
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="view.js"></script>
<script type="text/javascript" src="register.js"></script>
<script type="text/javascript" src="validate.js"></script>
<script type="text/javascript" src="user.js"></script>
<script type="text/javascript" src="order.js"></script>
<script type="text/javascript" src="type.js"></script>
等等等等。
$.getScript("user.js",function(){});
這樣,我們就做到頁面文件里面只需要引入
<script type="text/javascript" src="jquery.min.js"></script>
即可。
$.getScript("user.js",function(){ $.getScript("order.js",function(){ $.getScript("type.js",function(){ $.getScript("validate.js",function(){ // and so on..
}); }); }); });
PS:用In.js的watch函數是可以避免這種情況產生的。這不在本博文的考慮范圍了。
Using("User"); Using("Order"); Using("Type"); Using("Validate"); // and so on..
或者你願意,你可以
Using("User","Type","Order","Validate",...);
寫法問題 無所謂。當然我推薦使用第一種方法,清晰。
var u = new User(); var o = new Order(); // and so on..
但是會提出一個問題。假如異步的加載都在Using("XXX")的時候執行,那么
Using("User"); Using("Order"); Using("Type"); Using("Validate"); // and so on..
這一段我就需要異步載入4個文件,雖然是異步的,但是未免有些麻煩?而且需要創建4個鏈接。你願意合並JS的話,也可以。而且,Using的時候我是不需要使用對象的,這個時候未免太浪費資源了?
Using("User");
這個時候肯定是不加載,不加載做什么?當然是返回一個mock,也就是模擬對象。給用戶先用着,只有當用戶真正需要使用這個對象的時候,再去加載所需的js。也就是說
Using("User"); // 這句話執行完畢之后會創建一個User對象,當時僅僅是個mock
var u = new User(); // 這個時候用需要的是真實的User對象實例,就在這個時候去動態加載JS文件,並且返回已經實例化的User對象
大家都知道,異步加載是與當前運行的狀態不沖突的,也就是說
var u = new User();
這句話執行之后,u是一個沒有實際意義值的變量,而已。那么,怎么解決這個問題,我暫且想到的辦法,只能是采用同步策略了。只有當js加載完畢,再去執行之后的js語句,這個地方有點遺憾,而且同步可能帶來的瀏覽器假死,也是一個比較嚴重的問題,暫且不顧這些問題,希望以后能有更好的辦法解決。
$.getScript("user.js",function(){ var u = new User(); });
單單執行這個語句,要執行到function,本質上也是等user.js加載完畢才會執行,那么對比
var u = new User();
理論上時間應該相當,因為都是等user.js加載完畢之后才執行的。
Using.Config = { "User" : "/js/user" // 可以隱去.js 因為肯定是加載JS文件了
}
整個思路大概就是這個樣子,我在其基礎上進行了一些約束,比如加入了命名空間
var u = new Using.Modules.User();
這樣可以減少一些全局變量,而且有需要的話,可以插入一些所有對象可能都具有的共性,減少創建類時的重復編碼。
當然,也還是支持不使用命名空間的。
Using.Class.create("User",function(){ }).property({ }).static({ }).namespace(Using.Modules);
這里的大概意思就是
<script type="text/javascript" src="using.js"></script>
這樣接下來就可以寫
Using("jquery"); Using("User"); $("#ID").click(function(){ var user = new User(); user.name = "xx"; user.show(); });