|
这段时间与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错误都是缺少对象造成的。
|