原文地址:[url=http://www.jsparadise.cn/?p=358]]namespace+using 一种新的编写js的方式[/url]
在我前些天写的《Javascript “点符号“优化一则》里面介绍了Javascript对点语法的解析机制,在这里再说明一次:Javascript的对象中如果遇到的点符号“.”,就会首先检查它全部包含的方法和属性,直到检查到点符号后面指定的方法或者属性。从这点出发,如果对象中嵌套的级别越多,这对频繁操作对象中的属性和方法就非常影响执行效率了。因此,我编写了using函数,使得频繁的操作只需要声明一次,比如:
using函数还有另外一种方式,就是接受两个函数,比如:
using上面的两种方式都可以实现,而且可以互换操作,就是对同一个对象可以在两种方式中使用,比如:
上面的对using的介绍已经够详细了,现在我们来看看namespace方法的使用,namespace的作用已经不是什么新鲜事了,很多库中都使用了这种操作方法,比如Google的closure-library库中就大量使用了这种操作方式:
上面通过执行namespace函数之后,”dom.event.addevent”就会添加到LIB对象中作为命名空间,一级一级的添加。在closure-library中你可以看到非常多的使用goog.provider方法:
这个都是同理的。下面提供了using和namespace的源代码,欢迎大家指正:
在我前些天写的《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);