|
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的版本已经支持这种写法
|