刘海峰的个人主页 首页  |  站点地图  |  关于本站  |  与我联系  |  求职简历  |  给我留言  |  收藏本站  
作品展示 我的日记 音乐世界 文学花园 程序设计 人生感悟
刘海峰的个人主页 作品展示 我的日记 音乐世界 文学花园 程序设计 人生感悟
 
首页 > 程序设计 > 网站开发 > Javascript使用总结
Javascript使用总结
作者:刘海峰 / 来源:刘海峰的个人主页 / 发表时间:2007-04-06 18:44:37

这段时间与javascript打了不少交道,其中有喜有优,就像javascript本身,有很爽的地方,也有垃圾的地方。我努力回忆以往碰到的种种问题和心得,做一总结:

1、Javascript的数据

Javascript的数据类型是比较灵活的,看似没有什么类型。不过有时候还是要小心,不要让网页显示undefined,null之类的东西。关键时刻别忘了parseInt之类的(尤其在做算述运算时,要当心变成字符串连接)。

Javascript的数组有一个很方便的功能,就是push。比如:

var myArray = [];

myArray.push("element 1");

这样就把一个元素放进数组里了。不过要注意的是,在删除一个元素时,这个元素只是变成了null,它还是存在数组中的。我在网上查过资料,大约没有什么好的办法可以移除一个元素。好的办法没有,坏的办法是什么呢?就是把有值的元素全部push到另一个数组中,再把新数组赋值给老数组。简言之,倒腾一下。

2、Javascript的类与对象

Javascript可以实现类,但很勉强。我过几种不同的写法,觉得下面这一种比较好一些:

var MyBaseClass = function(){

this.propA = "propA";

this.methodA = function(){

alert(this.propA);

}

};

var MyNewClass = function(param){

this.Super=MyBaseClass;/* super是Javascript保留字,Super不是。这里并非一定要用Super,也可以用别的 */

this.Super();

delete this.Super;

/* 以上代码完成继承 */

this.propB = param;/* 这里的代码像一个构造器:) */

this.methodB = function(){

alert(this.propB);

this.methodA();/* 父类方法 */

};

};

var newClass = new MyNewClass("hello");

newClass.methodA();

newClass.methodB();

/* ... */

有时候会看到这样的代码:

var obj = new function(){

//...

};

这样是直接声明了一个对象。他与上面的方法是有区别的。new 出来的东西不能再用prototype。比如 newClass.prototype.xxx 是错误的,只能 MyNewClass.prototype.xxx 。不过,我的观查结果:如果用 MyNewClass.prototype.xxx 添加了一个新属性,newClass 里也会跟着有的。在 newClass 里新增对象可以直接 newClass.xxx 或 newClass['xxx']。

[带new与不带new的另一区别:new 出来的东西,this的使用没有发现出什么意外,而没有new的有时候会出意外。我在想没有new的也许相当于静态对象,他的this也只能引用静态成员,而不能引用动态成员。][注意:这一问题我没做细致观查,请慎重参考:P]

Javascript的类还是存在很多问题的,比如它没有public,private,protected等。这个也许不重要。有些人在所有应该是私有的方法前加了下划线以示区别。一个真正令人头痛的问题是setTimeout。如果在类的内部使用这个东东,会发生什么事情?传参会很麻烦~!有些参数不能直接写到setTimeout的参数里,而写到对象内部,好像会出现认不到的现象。看似只能把参数存成全局变量,取消参数传递才行。这样就严重破坏了对象的封存装性。

在使用dojo、dwr时会用到不少回调函数,如果这些回调函数有较复杂的参数,这一样是个麻烦!比如我有两个数据:data1,data2,现在我要先去调一个函数,再决定如何处理data1与data2。而要调的函数是有回调函数的:

function callback(){

/* how to get data1 & data2 ? */

};

function someJob(data1, data2){

callSomeFunc(callback);

};

这里我们可以用全局对象保存参数,也可以写成:

callSomeFunc(function(){/* ... */});

我没有测过,这种写法也许可以读到data1,data2。但如果callback函数还要call另一个函数,在另一个函数里的callback里才能去处理data1,data2,那该怎么办?我没试过可不可以再嵌套写,但我知道,写出这种代码,只会让阅读代码的人头痛死。

3、Javascript与DOM操作

节点类型问题:

如果我们遍历一个节点的子节点,在IE里不会有问题,但在Firefox里,你会得到许多奇怪的节点(一半节点是这样的)。这是因为Firefox里每个常规节点都会附带生成一个什么Text类型的节点(不可见的)。解决办法就是去判断节点类型:myDomNode.nodeType == 1 ?

innerHTML 与 createElement,appendChild:

正常情况下,他们达到的效果应该是一样的,但有时候会有些问题,而且这些问题往往在不同的浏览器里有不同的表现。由于那段时间忙得比较乱,具体问题已记不清了。

innerHTML问题:

如果要设一个较长的innerHTML,最好不要用+=之类的一点一点加。观查发现,如果我这么写:

node.innerHTML="<table>";

/* 聪明而又愚蠢的浏览器可能已经给你又添加了一个</table> */

node.innerHTML="<tr>;

/* 到这里,innerHTML可能是这样的:<table></table><tr></tr> */

在对节点进行操作时,尽量先判断一下节点是否存在。有好多JS错误都是缺少对象造成的。


相关评论 发表评论
称呼:  此名称显示在评论上
邮箱:  便于联系,不会在网上显示
评论:
验证:   点击以刷新验证码 
首页   |   站点地图   |   关于本站   |   与我联系   |   求职简历   |   给我留言   |   收藏本站
  声明:转载本站原创内容请务必注明出处并附上本站链接,否则视为侵权
本站部分内容来自互联网,如有版权问题,请与本站联系,本站将以最快的速度删除
·站长邮箱:webmaster(at)liuhaifeng.com  ·豫ICP备06016305号
 
::::: Copyright© 2006-2008 刘海峰 保留所有权利 ::: http://www.liuhaifeng.com :::::