JS技巧

来源:互联网 发布:dota2起源2多核优化 编辑:程序博客网 时间:2024/06/07 00:49

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