javascript动态加载实现方法一(2)


Using("User");
Using("Order");
Using("Type");
Using("Validate");
// and so on..


这一段我就需要异步载入4个文件,虽然是异步的,但是未免有些麻烦?而且需要创建4个链接。你愿意合并JS的话,也可以。而且,Using的时候我是不需要使用对象的,这个时候未免太浪费资源了?

至于这个问题,我的解决办法就是学习hibernate,延迟加载,按需加载。
那么怎么做呢?

复制代码 代码如下:


Using("User");


这个时候肯定是不加载,不加载做什么?当然是返回一个mock,也就是模拟对象。给用户先用着,只有当用户真正需要使用这个对象的时候,再去加载所需的js。也就是说

复制代码 代码如下:


Using("User"); // 这句话执行完毕之后会创建一个User对象,当时仅仅是个mock
var u = new User(); // 这个时候用需要的是真实的User对象实例,就在这个时候去动态加载JS文件,并且返回已经实例化的User对象


大家都知道,异步加载是与当前运行的状态不冲突的,也就是说

复制代码 代码如下:


var u = new User();


这句话执行之后,u是一个没有实际意义值的变量,而已。那么,怎么解决这个问题,我暂且想到的办法,只能是采用同步策略了。只有当js加载完毕,再去执行之后的js语句,这个地方有点遗憾,而且同步可能带来的浏览器假死,也是一个比较严重的问题,暂且不顾这些问题,希望以后能有更好的办法解决。

那问题出来了,这么做同步,有什么优势吗?
我不知道有什么优势,起码对比异步加载,应该没有劣势。比如正常的异步加载为

复制代码 代码如下:


$.getScript("https://www.jb51.net/user.js",function(){
var u = new User();
});


单单执行这个语句,要执行到function,本质上也是等user.js加载完毕才会执行,那么对比

复制代码 代码如下:


var u = new User();


理论上时间应该相当,因为都是等user.js加载完毕之后才执行的。

起码第二种看起来更像java式的代码,不必理会其他非业务相关的代码。

那么,怎么会知道需要的对象在什么地方,怎么加载进来?我能想到的就是模拟一个配置文件,为什么用配置文件,而不是像In.js用add函数或者其他框架的类似于register的函数,大概我只是想用配置文件,更像java,而且后期的修改起来也会更解耦一些吧。

复制代码 代码如下:


Using.Config = {
"User" : "/js/user" // 可以隐去.js 因为肯定是加载JS文件了
}


整个思路大概就是这个样子,我在其基础上进行了一些约束,比如加入了命名空间

复制代码 代码如下:


var u = new Using.Modules.User();


这样可以减少一些全局变量,而且有需要的话,可以插入一些所有对象可能都具有的共性,减少创建类时的重复编码。

当然,也还是支持不使用命名空间的。

为了解决这个约束的效力,加入了Class.create函数来进行类创建约束。

复制代码 代码如下:


Using.Class.create("User",function(){
}).property({
}).static({
}).namespace(Using.Modules);


这里的大概意思就是

create(类名,构造函数)
property(类的属性)
static(类的静态属性)
namespace(命名空间)

引申到此,为何不加入MVC形式?
后来我发现,要MVC,那么几个类之间的动态维护,或者创建之时就由Using这个类来自动维护,暂时还没想到好的解决办法,所以没有加入其中,只能自己创建类,自己维护了.

通过上面的文字,最后得到一个Using.js
然后在页面里面就只需要引入一个

复制代码 代码如下:


<script type="text/javascript" src="https://www.jb51.net/using.js"></script>


这样接下来就可以写

复制代码 代码如下:


Using("jquery");
Using("User");

$("#ID").click(function(){
var user = new User();
user.name = "xx";
user.show();
});

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wddsxx.html