1、自定义命名空间
在项目中,经常会遇到函数名冲突,在JAVA中由于有包的概念,能很好的解决命令冲突的问题。在js我们只能自己注意函数名,但是也有一些小技巧。在nodejs里面,我们可以利用下面的函数处理函数名冲突问题:
//首先定义一个全局变量,也可以不定义
//原理其实很简单,在JS中如果A已经被定义了,你可以在使用A.a定义一个新变量,但是A.a.b就会出错。
//我们的例子程序其实就是这个原理。fly作为全局域global的成员,然后给fly域再加一个fn的变量。
var fly = {};
//给全局变量定义一个叫fn的函数,作为类似JAVA包名的命名空间处理函数
fly.fn = function(){
//定义一个缓存量,存放已经定义的命令空间
var o = {},
//缓存数组,存放多级的命名空间
d;
//循环参数列表
for(var i in arguments){
//如果参数中有“.”,也就是说是多级的,需要先一级一级的从前往后定义。
//如fly.a.b.c就是4级的,得到一个[“fly”,“a”,“b”,“c”]的数组。
d = arguments[i].split(".");
//引入全局变量,首先把第一个参数作为全局变量,如果已经定义了就使用原来的,没有则设置为{}
o = global[d[0]] = global[d[0]] || {};
//从第二个开始循环,把数组中后一个参数作为前一个参数的变量
//例如[“fly”,“a”,“b”,“c”],a就是fly变量的子变量,b是a的子变量,以此类推。
for(var j in d.slice(1)){
var index = parseInt(j) + 1;
o = o[d[index]] = o[d[index]] || {};
}
}
};
console.log("start......");
//传入所个参数
fly.fn("jing.a.b.c","test.a.b.c");
console.log("end......");
//定义两个含命名空间的函数
jing.a.b.c = function(){
console.log("Test fly.fn('jing.a.b.c');");
}
test.a.b.c = function(){
console.log("Test fly.fn('test.a.b.c');");
}
//测试
jing.a.b.c();
test.a.b.c();
2、像jQuery一样使用$
//定义全局变量
var _global = global || window;
(function(a,undefined){
var jQuery = (function(){
var jQuery = function(selector, context){
var context = context || {};
return context.indexOf(selector);
};
return jQuery;
})();
//把自定义的变量返回给全局
a.jQuery = a.$ = jQuery;
})(_global);//传入全局变量
//测试,查询c在abc中的位置
console.log($("c","abc"));
以上函数是模拟jQuery$符号的使用,作用就是查询一个字符在另一个字符中的位置。
3、像extjs一样实现继承
// 使用原型赋值方式
function extend(Child, Parent) {
// 申明一个临时空对象
var Temp = function () {
};
// 把父对象的原型赋值给临时对象原型
Temp.prototype = Parent.prototype;
// 然后再把子对象的原型赋值为临时对象
Child.prototype = new Temp();
// 最后指定子对象的原型构造函数为子对象自己(在子对象原型被临时对象赋值后,子对象的原型的构造函数其实是临时对象了,需要改正回来)
Child.prototype.constructor = Child;
// 保存一个对象,存放父对象的原型。这样子对象就可以直接调用父对象里面的方法了
Child.up = Parent.prototype;
}
// 使用原型拷贝方式
function extend2(Child, Parent) {
// 获取父对象原型
var p = Parent.prototype;
// 获取子对象原型
var c = Child.prototype;
// 循环拷贝
for (var i in p) {
c[i] = p[i];
}
// 保存一个对象,存放父对象的原型。这样子对象就可以直接调用父对象里面的方法了
c.up = p;
}