`
zxmlgh
  • 浏览: 38645 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

提速javascript开发(二)

阅读更多
例子
  1. //得到当前对象的名称   
  2. Object.prototype.getClassName = function()   
  3. {   
  4.     return this.toString().match(/function\s*(\w+)/)[1];   
  5. };         
  6. /**  
  7.  * 实现单一多层结构的继承  
  8.  * @param arguments[0] 指定的类名,非字符串型,不可以是null。  
  9.  */    
  10. Object.prototype.inherit = function()   
  11. {                  
  12.     try{   
  13.         if(!(arguments[0] instanceof Object)) throw new Error("you can just inherit from a Object");   
  14.         if(this["parent"]) throw new Error("there have inherited class,you can't inherit class "+arguments[0].getClassName());         
  15.     }catch(e){   
  16.         alert(e.message);   
  17.         return;   
  18.     }   
  19.     var arg = new Array();   
  20.     for(var i=0; i
  21.     arg[i] = arguments[i+1];                       
  22.     var temp = new arguments[0](arg);                 
  23.     for(var i in temp){   
  24.         if(!this[i])   
  25.             this[i] = temp[i];                     
  26.     }   
  27.     this["parent"] = temp;                 
  28. }   
  29. //用来访问父类的public资源   
  30. Object.prototype.father = function(){                  
  31.     if(this.parent==nullreturn;   
  32.     if(this.parent[arguments[0]]){   
  33.         var temp = this.parent[arguments[0]].toString();   
  34.         if(temp.indexOf("function")<0)   
  35.             return this.parent[arguments[0]];   
  36.         else{   
  37.                 var arg = new Array();   
  38.                 for(var i=0; i
  39.                 arg[i] = arguments[i+1];   
  40.                 return this.parent[arguments[0]](arg);   
  41.         }                          
  42.     }else{   
  43.         this.parent.father(arguments);   
  44.     }   
  45. }   
  46. //与javascript的关键字typeof区别在:o大写   
  47. Object.prototype.typeOf = function(){   
  48.     var target = arguments[0];   
  49.     var result = this instanceof target;   
  50.     if(!result){   
  51.         var temp = this.parent;   
  52.         while(temp!=null){   
  53.             result = temp instanceof target;   
  54.             if(!result)   
  55.                 temp = temp.parent;   
  56.             else  
  57.                 break;   
  58.         }   
  59.     }   
  60.     return result;                                                                 
  61. }   
  62. //将子类转换成父类,注意:如果子类覆盖了父类的方法,那么换转后的类,该方法的实现仍然是子类中的实现版   
  63. Object.prototype.toParent = function(){   
  64.     var result = null;   
  65.     var target = arguments[0];   
  66.     var flag = this instanceof target;   
  67.     if(!flag){   
  68.         var temp = this.parent;   
  69.         while(temp!=null){   
  70.             flag = temp instanceof target;   
  71.             if(!flag)   
  72.                 temp = temp.parent;   
  73.             else{   
  74.                 result = {};   
  75.                 for(var p in temp){   
  76.                     if(this[p])   
  77.                         result[p] = this[p];   
  78.                     else  
  79.                         result[p] = temp[p];   
  80.                 }   
  81.                 break;   
  82.             }                              
  83.         }   
  84.     }else  
  85.         result = this;   
  86.     return result;   
  87. }              
  88. /**  
  89.  * 下面的继承关系是A inheritB,B inherit C,D是一个测试多态的方法  
  90.  */  
  91. function A(){   
  92.     this.inherit(B,"x");   
  93.     this.inherit(C);               
  94.     var locate1 = "1oh";                   
  95.     this.locate2 = "2oh";   
  96.     //A类继承B中的methodB1(),并且在自己的method1中调用B的methodB1                 
  97.     this.method1 = function(){                     
  98.         alert("A:test继承——I am use B's variant: "+this.methodB1(true));                     
  99.     }   
  100.     //A类覆盖B中的method2(),并且在自己的method2中调用B的method2   
  101.     this.method2 = function(){   
  102.         var str = "A:test覆盖method2,result is:"+this.father("method2","ok");   
  103.         alert(str);                                        
  104.     }   
  105.        
  106.     //A类覆盖了类C中的method3   
  107.     this.method3 = function(str){   
  108.         return "excuting class A's method";   
  109.     }                                  
  110. }   
  111. function B(){   
  112.     this.inherit(C,"y");   
  113.     var locateB2 = "";   
  114.     var locateB1 = arguments[0];                   
  115.     this.methodB1 = function(flag){                    
  116.         if(flag)   
  117.             return locateB1;   
  118.         else  
  119.             return "A converted B is success";   
  120.     }   
  121.        
  122.     this.method2 = function(){   
  123.         var str =arguments[0]+" B's "+locateB1+" "+this.method1();                                                     
  124.         return str;   
  125.     }   
  126.     //B类覆盖了类C中的method3   
  127.     this.method3 = function(str){   
  128.         return "excuting class B's method";   
  129.     }   
  130. }   
  131. function C(){   
  132.     var locate1 = arguments[0];   
  133.     this.method1 = function(){   
  134.         return "C's "+locate1;                     
  135.     }   
  136.     this.method3 = function(){   
  137.         return locate1;   
  138.     }   
  139. }   
  140. /**  
  141.  * 在这个方法中,只会对C类的method3方法,如果参数是C的子类也会处理这个参数的method3方法。  
  142.  */  
  143. function D(){   
  144.     var target = arguments[0];   
  145.     if(!target.typeOf(C)){   
  146.         alert("upper my scope");   
  147.         return;   
  148.     }   
  149.     alert("test多态:"+target.method3());                                     
  150. }              
  151. var a = new A;   
  152. a.method1();//在其中调用了从B中继承过来的methodB1()   
  153. a.method2();//A类覆盖B中的method2(),并且在自己的method2中调用B的method2   
  154. var temp = a.toParent(B);   
  155. alert(temp.methodB1(false)+": "+temp.method3());//转换成父类后,对象执行的方法仍然是子类版的。   
  156. var b = new B("b^-^");   
  157. D(a);   
  158. D(b);   
  159. //现在业务需要,扩展出一个E   
  160. function E(){   
  161.     this.inherit(C,"change is so much!");      
  162. }   
  163. D(new E());//扩展性与通用性的表现  
注意事项】:
1) 需要用这种继承的写法,请将下面的方法当作javascript 的api,不要覆盖。
方法名称
方法作用
参数说明
getClassName
获得对象的名称。
inherit
实现对象之间的单一多层的继承
1:被继承的父类名,非字符串
2:父类初始化需要的参数
father
如果子类覆盖了父类的某个方法,用它来回调父类的这个方法
1:回调的方法名称,字符串格式
2:回调方法需要的参数
typeOf
判断子类的类型,与typeof是不一样的。
类的名称,非字符串形式。
toParent
将子类转换成父类
父类的名字,非字符串形式。
2) 在子类的第一行执行继承。如果要覆盖父类的某个方法,并且要用父类的这个方法,那么请在子类的方法中回调父类的那个方法。
 
3.3、活用闭包
所谓闭包,通俗的讲,使用函数的范围,已经不在函数的定义范围。
优点:进一步提高代码的封装性。
缺点:ie6的垃圾收集机制存在着bug,当进行ui编码时会出现一些问题。
闭包的特点
1、作为一个函数变量的一个引用 - 当函数返回时,其处于激活状态。
2、一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
闭包的写法
  1. function A(){   
  2.     var answer1 = function(str){   
  3.         alert("这里提供复杂功能1");   
  4.     }   
  5.     var answer2 = function(str){   
  6.         alert("这里提供复杂功能2");   
  7.     }   
  8.     this.getAnswer = function(flag){   
  9.         if(flag)   
  10.             return answer1;   
  11.         else  
  12.             return answer2;   
  13.     }   
  14. }   
  15.   
  16. var control = new A();   
  17. var a1 = control.getAnswer(true);   
  18. var a2 = control.getAnswer(false);   
  19. a1();//弹出文字:这里提供复杂功能1   
  20. a2();//弹出文字:这里提供复杂功能2   
  21. /**  
  22.  * 1)通过闭包,对象A将自己的资源提供给了外部。  
  23.  * 2)并且外部的代码对a1之类的变量做出了改变,不会影响到A对象内部  
  24.  * 下面对A类稍作修改,我们看看效果  
  25.  */  
  26. function A(){   
  27.     var answer1 = function(str){   
  28.         alert("这里提供复杂功能1");   
  29.     }   
  30.     var answer2 = function(str){   
  31.         alert("这里提供复杂功能2");   
  32.     }   
  33.     this.getAnswer = function(flag){   
  34.         if(flag)   
  35.             return answer1;   
  36.         else  
  37.             return answer2;   
  38.     }   
  39.     this.answer = function(){   
  40.         answer1();   
  41.     }   
  42. }   
  43.   
  44. var control = new A();   
  45. var a1 = control.getAnswer(true);   
  46. a1();   
  47. a1 = "1";   
  48. control.answer();//弹出文字:这里提供复杂功能1   
3.4、函数式编程
它的基本特点是:将函数(或对象)赋值给一个变量。前面我们已经采用了这种写法。
优点:代码可读性好。适合web页ui方面的开发
错误的写法
  1. function A(){   
  2.     alert(B());   
  3.     var B = function(){   
  4.         return "ok";   
  5.     }   
  6. }   
  7. A();  
正确的写法
  1. function A(){   
  2.     var B = function(){   
  3.         return "ok";   
  4.     }   
  5.     alert(B());    
  6. }   
  7. A();  

附:javascript是非常灵活的:

1)基于对象的:有对象与类的概念,也有独立于对象的函数概念

2)解释型:请把握住运行时与时间轴这个概念:它能自动转化变量的类型与这个特点紧密相连;一段代码是当作函数,还是一个类,也与这个有关。

2)弱类型:会将变量自动转化为当前合适的类型或者基本数据类型,这个特点基于它是解释型的语言。

这些充分体现了javascript的灵活型。建议使用它,不要走极端:将其对象的一面在需要的时候充分运用,但没有必要任何情况下都这样做。所谓灵活:在不同的情况,可以有适合的方式可用。

(完)

分享到:
评论
14 楼 joshuayan 2007-03-13  
学习了
13 楼 tsfy13 2007-03-13  
至于它可能会带来些问题,那是肯定的
不过我在应用中还是没有碰到

而且Js还面对浏览器兼容的问题
总归要回避一些的

模仿OO语言的特性在使用上还是有一定便利的
12 楼 tsfy13 2007-03-13  
我用过一个js框架, jsolait, 那里面的思路和lz很相似
里面有Module 和 Class 两个概念
还是挺实用的,可以实现比较好的封装和继承

我在上个项目里用的就是这个,还是不错的
11 楼 zxmlgh 2007-03-12  
<p>javascript是非常灵活的:</p>
<p>1)<font color='#ff0000'>基于对象的</font>:有对象与类的概念,也有独立于对象的函数概念</p>
<p>2)<font color='#ff0000'>解释型</font>:请把握住运行时与时间轴这个概念。它能自动转化变量的类型与这个特点紧密相连。它是不是将一段代码当作函数,还是一个类,也与这个有关。</p>
<p>2)弱类型:会将变量自动转化为当前合适的类型或者基本数据类型。</p>
<p>这些充分体现了javascript的灵活型。建议使用它,不要走极端:将其对象的一面<font color='#ff0000'>在需要的</font>时候充分运用,但没有必要任何情况下都这样做。<font color='#ff0000'>所谓灵活</font>:在不同的情况用适合的方式。</p>
<p> </p>
10 楼 whisper 2007-03-12  
把挺好的javascript模仿的跟java似的
就好像在java里面模拟malloc
9 楼 cozone_柯中 2007-03-12  
<br/>
<strong>jindw 写道:</strong><br/>
<div class='quote_div'><br/>
<strong>zxmlgh 写道:</strong><br/>
<div class='quote_div'>
<p>    如果你要用spring或者别的框架,要写annotation的地方,要补充xml的地方,也要补充。你的代码如果要用这些框架,不可能因为自己的代码要补充annotation或者多写一些xml文件,或者要调整代码的一些细节。就说这些框架是垃圾!不太负责哦。请大家多指教</p>
</div>
<br/>
<br/>
知道spring为什么会流行嘛?<br/>
重要的一点,他是无侵入的框架。<br/>
<br/>
而你这个很多是都是没必要的侵入,而且是非常严重的侵入。<br/>
使用spring,我只需要增加点东西,不用把原来的代码东改西删。而使用你的东西,我的代码里遍地寻找一通,还得左右嘱咐身边的哥们,千万别。。。。<br/>
我值得吗?<br/>
<br/>
<br/>
<br/>
<br/>
代价嘛,能少一点就少一点。<br/>
Object是javascript的根本,我今天可算是第一个见敢于改动Object 原型的。<br/>
其实你这对Object原型的改动,是完全没必要的,继承于Object何干?Function足以!</div>
<br/>
<br/>
<br/>
<br/>
<strong>比较赞同 <strong>jindw 的说法,其实javascript开发简单就好,封装方法是有必要的,但是没有必要这样。</strong></strong>
8 楼 jianfeng008cn 2007-03-11  
<br/>
<font style='background-color: #ccffcc;'><strong>zxmlgh 写道:</strong><br/>
</font>
<div class='quote_div'>
<p><font style='background-color: #ccffcc;'>这些内容确实容易误导人,如果能在javascript语言实现这个级别,完成这些功能,会更好些。<strong><font color='#ff0000'>super与extends</font></strong>都是javascript的保留字,我想javascript语言的设计者,对这方面也是有自己的思考:要用这些,又没用。我不清楚这些设计者的思考是怎么样的,也不太清楚他们顾虑的是什么。既然保留了,那将来肯定是会实现这些功能的。这些编码模式平时自己用的也蛮爽<img src='/javascripts/fckeditor/editor/images/smiley/msn/tounge_smile.gif' alt=''/>,就暂时做个出头鸟吧!</font></p>
<p><font style='background-color: #ccffcc;'>     恩楼上说在Function中做这些值得思考,多谢指点。不过这样做,不是不好而是会遇上一些问题,我暂时无法用语言组织。大家多提些意见,我们一起前进。</font></p>
<p><font style='background-color: #ccffcc;'/></p>
<p>     <font style='background-color: #00ff00;'>恩楼上说在Function中做这些值得思考,多谢指点。不过这样做,不是不好而是会遇上一些问题,我暂时无法用语言组织。大家多提些意见,我们一起前进。</font></p>
<p>能否稍微列举一点呢?</p>
</div>
<br/>
<br/>
<br/>
<br/>
7 楼 zxmlgh 2007-03-10  
<p>这些内容确实容易误导人,如果能在javascript语言实现这个级别,完成这些功能,会更好些。<strong><font color='#ff0000'>super与extends</font></strong>都是javascript的保留字,我想javascript语言的设计者,对这方面也是有自己的思考:要用这些,又没用。我不清楚这些设计者的思考是怎么样的,也不太清楚他们顾虑的是什么。既然保留了,那将来肯定是会实现这些功能的。这些编码模式平时自己用的也蛮爽<img src='/javascripts/fckeditor/editor/images/smiley/msn/tounge_smile.gif' alt=''/>,就暂时做个出头鸟吧!</p>
<p>     恩楼上说在Function中做这些值得思考,多谢指点。不过这样做,不是不好而是会遇上一些问题,我暂时无法用语言组织。大家多提些意见,我们一起前进。</p>
6 楼 netfishx 2007-03-10  
说两句,我也投了良好帖,因为lz总结了很好的参考资料。但我也很想投隐藏,lz的这些东西很容易误导别人。
5 楼 jindw 2007-03-10  
<br/>
<strong>zxmlgh 写道:</strong><br/>
<div class='quote_div'>
<p>    如果你要用spring或者别的框架,要写annotation的地方,要补充xml的地方,也要补充。你的代码如果要用这些框架,不可能因为自己的代码要补充annotation或者多写一些xml文件,或者要调整代码的一些细节。就说这些框架是垃圾!不太负责哦。请大家多指教</p>
</div>
<br/>
<br/>
知道spring为什么会流行嘛?<br/>
重要的一点,他是无侵入的框架。<br/>
<br/>
而你这个很多是都是没必要的侵入,而且是非常严重的侵入。<br/>
使用spring,我只需要增加点东西,不用把原来的代码东改西删。而使用你的东西,我的代码里遍地寻找一通,还得左右嘱咐身边的哥们,千万别。。。。<br/>
我值得吗?<br/>
<br/>
<br/>
<br/>
<br/>
代价嘛,能少一点就少一点。<br/>
Object是javascript的根本,我今天可算是第一个见敢于改动Object 原型的。<br/>
其实你这对Object原型的改动,是完全没必要的,继承于Object何干?Function足以!
4 楼 zxmlgh 2007-03-10  
<p><font>  每样东西都有适合它的位置——没有哪样东西是万能的,每样东西要用,也有它的成本。我们只在需要的时候用它。</font>如果你这里要用到上面的一些方法,比如继承,那么你自然要往你的map对象中加东西。继承的意思,第一是复用。你如果决定要继承,alert(map[k])里的情况你自然要考虑。这就是所谓的成本!我从不指望没有成本的使用某些东西。无论哪门语言都有它的成本。</p>
<div class='dp-highlighter'>
<div class='bar'/>
<ol class='dp-c'>
    <li class='alt'><span><span class='keyword'>var</span><span> map = {key1:1,key2:2};    </span></span> </li>
    <li class=''><span/><span class='keyword'>for</span><span>(</span><span class='keyword'>var</span><span> k </span><span class='keyword'>in</span><span> map){    </span> </li>
    <li class='alt'><span>alert(map[k]);    </span> </li>
    <li class=''><span>}   </span> </li>
</ol>
</div>
<p> </p>
<p>    如果你要用spring或者别的框架,要写annotation的地方,要补充xml的地方,也要补充。你的代码如果要用这些框架,不可能因为自己的代码要补充annotation或者多写一些xml文件,或者要调整代码的一些细节。就说这些框架是垃圾!不太负责哦。请大家多指教</p>
3 楼 jindw 2007-03-10  
居然不是精华了,那就评论一下:

先不论你这些API的优劣,首先,你严重的污染了JavaScript。
举例:
我原来有断代码:
var map = {key1:1,key2:2};
for(var k in map){
  alert(map[k]);
}
加上你的程序之后,原来这段代码的行为就改变了!

有了这种风险,还有那位敢轻易使用这个?
2 楼 jindw 2007-03-10  
呵呵,javaeye的精华帖都这样,下次大伙就没必要来这里逛了。
1 楼 netfishx 2007-03-10  
这是精华贴???

相关推荐

    为IE浏览器的javascript提速.docx

    JavaScript是Web开发中不可或缺的一部分,尤其在现代网页设计中,其使用越来越广泛。然而,不同浏览器对JavaScript的处理效率存在差异,尤其是对于IE浏览器来说,虽然IE8在性能上有显著提升,但仍落后于如Chrome这样...

    js全面基础与提速

    总之,“js全面基础与提速”教程将带你从JavaScript基础入手,逐步掌握AJAX和jQuery的使用,为Web开发打下坚实基础。无论你是初学者还是希望提升技能的开发者,这个教程都能为你提供宝贵的学习素材。

    《jQuery全面提速》

    #### 二、jQuery全面提速的意义与目的 在《jQuery全面提速》这本书中,作者赵增敏旨在帮助读者深入理解如何优化基于jQuery的应用程序,提高其性能表现。随着网络技术的发展和用户对网页加载速度要求的不断提高,...

    网站访问速度优化提速方法

    - 学习使用jQuery等JavaScript库来简化DOM操作,提高开发效率。 - 图片元素使用`&lt;img&gt;`标签时,应设置`title`和`alt`属性;`&lt;head&gt;`标签中包含`title`、`keywords`和`description`等元信息。 - 开启GZIP压缩功能...

    ASP提速的六种方法

    ASP 提速的六种方法 在 ASP.NET MVC 开发中,提高应用程序的性能是一件非常重要的事情。以下是六种可以提高 ASP 应用程序速度的方法。 应用程序缓存 应用程序缓存是一种非常有效的提高应用程序速度的方法。通过将...

    前端工程师手册.pdf

    * SPA 什么是 SPA、单页面 SEO 解决方案、开发无框架单页面应用、可伸缩的同构 JavaScript 代码 动画相关 * 动画类型、跟动画有关的数学和物理公式、缓动原理与实现、常用动画效果与缓动、SVG 动画原理性质 性能...

    0.1秒的价值!浅谈Web前端页面提速问题

    【网页加载速度优化策略】 在当今的互联网世界中,用户对网页速度的期待越来越高,哪怕只有0.1秒的差距,也可能影响用户的满意度和...记住,用户体验始终是设计和开发的核心,快速响应的页面是赢得用户青睐的关键。

    jquery全面提速

    《jQuery全面提速》源代码是针对JavaScript库jQuery的学习资源,旨在帮助开发者深入理解jQuery的内部工作原理,并通过优化技巧提升其在项目中的运行效率。jQuery以其简洁的API和强大的功能深受开发者喜爱,但随着Web...

    前端开发与小程序面试题目.pdf

    - 第二部分定义列表样式,如内部位置、方形符号和自定义图像。 - 第三部分设置文本颜色和内边距。 笔试题目涉及CSS布局、JavaScript实现、H5特性、正则表达式、服务端编程等,这些题目旨在测试实际编程能力和问题...

    前端程序员必须知道的高性能Javascript知识

    在当今的前端开发领域,JavaScript作为全栈开发的核心语言之一,在浏览器、移动端以及服务器端均有着广泛的运用。掌握高性能的JavaScript编写技巧,对于前端程序员来说至关重要。本文将详细介绍在编写高性能...

    《高性能网站建设指南》-- 想网站打开速度快,必看。

    本书结合Web 2.0以来Web开发领域的最新形势和特点,介绍了网站性能问题的现状、产生的原因,以及改善或解决性能问题的原则、技术技巧和最佳实践。重点关注网页的行为特征,阐释优化Ajax、CSS、JavaScript、Flash和...

    游戏音乐娱乐类网站源码-游戏公司开发响应式网页模板-支持移动端.zip

    面向数字娱乐市场的HTML网站源码,为开发提速。这份源码针对娱乐游戏音乐领域,提供即用型解决方案,减少从头开发的繁琐流程。精心设计的界面与用户交互元素,保证吸引目标用户群体。集成的音乐播放功能,提升用户...

    黎科峰-布道师-《终端减负,管道加速:百度云端一体为Web App提速》

    百度作为中国的互联网公司,通过其云端一体开发平台,为开发者提供了云端切分机制。开发者可以根据任务的时延要求和计算量来决定任务的处理位置,将计算密集型的任务放在云端处理,而实时性要求高的任务则保留在本地...

    基于微信小程序的点餐系统 (1).pdf

    微信小程序点餐系统的设计和开发,是信息技术领域内移动互联网应用发展的一个分支,随着智能手机的普及和移动网络的提速,这一领域正迅速发展。微信小程序,作为一种新兴的轻量级应用程序,因其便捷性、无需下载安装...

    新产品,新希望.pdf

    3. Windows Mobile 6.5的发布和Gesture API:Windows Mobile 6.5发布了,带来了Gesture API和Widgets,Gesture API可以判断拖拽、缩放等功能,Widgets支持W3C标准,使用HTML和JavaScript开发。 4. 移动应用格局的...

    MFC下好用的高速绘图控件-(Hight-Speed Charting)

    1. **多平台兼容**:除了MFC,TeeChart还支持.NET、Java、JavaScript等多种平台,便于跨平台开发。 2. **三维图表**:除了标准二维图表,还支持3D视图,使数据呈现更加立体直观。 3. **复杂图表组合**:可以将多种...

    提高ios上click的响应速度

    FastClick是由FT Labs开发的一个轻量级JavaScript库,它的核心功能是检测并处理触摸结束事件,从而在用户单击后立即触发点击事件,避免了系统默认的300毫秒等待时间。这在移动Web应用中尤其重要,因为快速的交互反馈...

    WebSocket客户端和服务端实例源码

    基于 Flash,AdobeFlash 通过自己的 Socket 实现完成数据交换,再利用 Flash 暴露出相应的接口为 JavaScript 调用,从而达到实时传输目的。此方式比轮询要高效,且因为 Flash 安装率高,应用场景比较广泛,但在移动...

    毕业设计新项目-基于WebGIS的淮河水量水质监测系统源码+项目说明文档.zip

    【4】如果基础还行,或热爱钻研,可基于此项目进行二次开发,DIY其他不同功能,欢迎交流学习。 【注意】 项目下载解压后,项目名字和项目路径不要用中文,建议解压重命名为英文名字后再运行!有问题私信沟通,祝...

Global site tag (gtag.js) - Google Analytics