浏览 2902 次
锁定老帖子 主题:javascript tips
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-09-09
1、objects and associative arrays javascript中,对象属性操作与数组很类似。 但 javascript也为我们做了一些工作,把 数字转化为字符串。不过还是建议自己写清楚 foo[1] == foo[(1).toString()] == foo['1']; 2、cute type conversions 这些基本我们都知道。 也可看看 http://www.jibbering.com/faq/faq_notes/type_convert.html 0 + '' == 0 '' + 0 == 0 1 + '' == 1 '' + 1 == 1 0 + 'a' == '0a' 'a' + 0 == 'a0' 但这个技巧呢?很多lib里面都用了。 var a=function(){} var b=new a(); alert(!b) alert(b) 3、iteration prototype.js,jQuery。n多的FP的东西。 4、anonymous functions 也见 http://developer.mozilla.org/en/docs/New_in_JavaScript_1.6 yield,反正我自己用起来很别扭。 喜欢ruby的yield. var range = function (start, stop, step) { return function () { var at = start; start += step; if (at < stop) return at; else throw new Error(); }; }; var next = range(0, 6, 2); alert(next())//0 alert(next())//2 alert(next())//4 大量的应用”闭包“,始终感觉性能上有些问题。可能是个人感觉 5、enclosure (function () { ... }).call(this); 语言的”最小单元“,不知道该叫什么。但是java里面,所谓”最小单元“,也是一个类。而javascript或ruby之类的,一断代码就可以,可以通过上面的方法动态注入执行环境。我不是很喜欢javascript的eval的功能。 with也有类似功效。好象很多书都不建议用with。性能慢是一个原因。感觉javascript语言不想让代码编写者了解“scope chain”。所以闭包,with,eval等等都不是很流行。可能这方面javascript设计的不是很严谨??? 6、context object manipulation Function.apply Function.call 在这里很关键, 在java中,那么多设计模式都是关于接口的,我理解为java中接口是最小单元,如果没有接口,你根本不知道那些方法的context object是什么,也不可能执行方法。 而javascript呢?有function就好了,注意this都ok了。 读了jQuery代码后,在这方面有很多感想,有时间具体分析一下。 7、variadic arguments 小tip。 8、binding 与第六差不多。 跑题: javascript模拟java的面向对象编程时,其实也模拟的java的”缺点“,状态保存的位置!!! var Button=function (dom){ this.**=**; this.**=**; } 这种”类“其实完全没有必要的!!! 9、lazy function definition 大家讨论不少了! 相同的功能,其实YUI代码里早用到了。 http://developer.yahoo.com/yui/docs/Dom.js.html 见getStyle setStyle 等。 var getPi = function () { var pi = calculatePi(); getPi = function () { return pi; } return pi; }; 我到是不认为它这例子好。真正这些功能都在lib中实现,象cache,function覆盖等! 10、polymorphic callable objects 新的想法,区别java之类的多态 var callableType = function (constructor) { return function () { var callableInstance = function () { return callableInstance.callOverload.apply(callableInstance, arguments); }; constructor.apply(callableInstance, arguments); return callableInstance; }; }; var SubmarineFactory = type(function () { var length; this.init = function (length) { length = lengthValue; }; this.callOverload = function () { return Submarine(length); }; }); 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |