2007-08-21
TAG:JavaScript

项目中应用prototype 1.4 后,html的元素就带有很多方便的方法,如toggle,setStyle等,比如要隐藏id为“abc”的元素,可以这样:
Element.hide($("abc"))
虽然这样可以简便快捷地达到效果,但这句语法却有非常明显的函数式编程的风格,与面向对象相差甚远。对于隐藏某html元素,理想的oop语法是:
$("abc").hide()
这两种方式相比较,后者语法更容易接受,这语句可以这样来解释:执行该html元素内置的hide方法。然而对于第一种语法方式,解释为:执行Element类(方法库)中的hide方法,参数就是被执行的html元素。

ok,为了实现这种更oop风格的语法,在没有prototype1.4的框架下,可以这样定义:

<script type="text/javascript">
  <!--
 function extend(src,target){
  for (var key in target){
   src[key] = target[key];
  }
  return src;
 } 
 var ElementFunctions = {
  getStyle:function(s){return this.style[s];},
  hide:function(){this.style.display="none";return this;},
  show:function(){this.style.display="";return this;}
 } 
 function $(){ 
  var _obj = typeof(arguments[0])=="string"? document.getElementById(arguments[0]) : arguments[0];
  return extend(_obj,ElementFunctions);
 }
  //-->
  </script>
<input type="button" onclick="$('abc').hide()" value="hide" />
<input type="button" onclick="$('abc').show()" value="show" />
<div id="abc" style="border-right: #ccc 1px solid; border-top: #ccc 1px solid; background: #eee; border-left: #ccc 1px solid; width: 300px; border-bottom: #ccc 1px solid; height: 120px">asdfasdf</div>

从上面的代码上看,extend本意为继承,但看其代码,其实就是把父类的属性与方法都赋给子类,ElementFunctions 定义了一组操作html元素的方法库,最关键的是 $() 函数中的 extend(_obj,ElementFunctions),这表示用 $ 符号取来的元素都要继承上面定义的ElementFunctions方法库。

因此就可以非常简单地执行 $("abc").hide() 了,ElementFunctions 还可以继续扩展为更全面的方法库。

这种方法有个缺点是每次用 $ 符号取元素,都要给该元素赋方法(也可以说是继承发生在用$取元素时),赋方法的过程使用了for in遍历循环,效率比较低,特别是方法库很大时,会很明显影响效率。这点需要注意。

prototype 1.5的版本已经支持这种写法






坯子 @ 20:26:25 | 引用 0 | 编辑



评论
 
学习笔记 (http://www.studynote.cn) @ 2007-08-28 14:04:47
呵呵,我用jQuery比较多,



发表评论
 姓名: 
 E-mail: 
 地址: