JS技巧

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;
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值