namespace+using 一种新的编写js的方式

原文地址:[url=http://www.jsparadise.cn/?p=358]]namespace+using 一种新的编写js的方式[/url]
在我前些天写的《Javascript “点符号“优化一则》里面介绍了Javascript对点语法的解析机制,在这里再说明一次:Javascript的对象中如果遇到的点符号“.”,就会首先检查它全部包含的方法和属性,直到检查到点符号后面指定的方法或者属性。从这点出发,如果对象中嵌套的级别越多,这对频繁操作对象中的属性和方法就非常影响执行效率了。因此,我编写了using函数,使得频繁的操作只需要声明一次,比如:

using(LIB.dom.classes).behavior(function(){
this.add=function(c){
this.classname=c;
}
//......
}

using函数还有另外一种方式,就是接受两个函数,比如:

using(LIB.dom.classes,function(){
this.add=function(c){
this.classname=c;
}
//......
});

using上面的两种方式都可以实现,而且可以互换操作,就是对同一个对象可以在两种方式中使用,比如:

//LIB.namespace是我接下来要说明的一个函数
LIB.namespace("dom.event");
using(LIB.dom.event,function(){
this.show=function(){
alert("Hello");
};
});

using(LIB.dom.event).behavior(function(){
this.show();
});

上面的对using的介绍已经够详细了,现在我们来看看namespace方法的使用,namespace的作用已经不是什么新鲜事了,很多库中都使用了这种操作方法,比如Google的closure-library库中就大量使用了这种操作方式:
LIB.namespace("dom.event.addevent");

上面通过执行namespace函数之后,”dom.event.addevent”就会添加到LIB对象中作为命名空间,一级一级的添加。在closure-library中你可以看到非常多的使用goog.provider方法:
goog.provide('goog.dom.classes');

这个都是同理的。下面提供了using和namespace的源代码,欢迎大家指正:


try {LIB} catch (e) { LIB = {}}
LIB.namespace = function(s){
var names = s && typeof s.split === "function" ? s.split(".") : [];
var i = 0, o = c = "";
while (c = names[i++]) {
o += "['" + c + "']";
eval(i === 1 ? "LIB" + o + "={};" : "LIB" + o + "={};");
}
};
(function(global){
function _u(obj, fn){
fn ? fn.call(obj) : this.o = obj;
}
global.using = function(o, f){
if (f) {
return _u(o, f);
} else {
_u.prototype.behavior = function(f){
f.call(this.o);
}
return new _u(o);
}
}
})(this);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值