1、JavaScript中的继承
在 JavaScript中实现继承的方法是:将子类的 prototype 属性设置为父类的对象。
例如,我有一个 Basket 类,继承 Hashtable 类:
java代码:
Basket.prototype = new Hashtable();
Basket.prototype.constructor = Basket;
如果不写上面第二句,以后 typeof 一个 Basket 的对象获得的就是 Hashtable 了。
但是需要注意的是,由于所有的子类(Basket)的对象实例共享同一个原型对象(Hashtable),因此在父类对象的构造函数中只能保存对所有子类对象均相同的实例变量。对每个子类不同的实例变量必须放在子类的的构造函数中。很多时候父类对象没有任何自己的实例变量,而只有一些方法,操作的是子类对象的实例变量。
2、JavaScript中变量的作用域
JavaScript代码:
var v = "aaa";
function func() {
alert(v);
...
var v = "bbb";
}
alert 出来的是什么?你肯定会说是 "aaa",错,alert 出来的是 "undefined"。为什么?
因为 java-script 为了简化处理,变量实际上只有两种作用域,全局变量和函数的内部变量。你在函数内部任何一个地方定义的变量其作用域都是整个函数体。而在 alert 的时候函数的内部变量 v 已经定义了,并且覆盖掉了同名的全局变量 的定义,只是还没有被初始化,所以 alert 出来的是 "undefined"。
3、undefined 和 null
有些开发人员误以为在 java-script 中,
return;
返回的就是 null,也就是
return null;
这是一个误解,在 java-script 中,
return;
返回的是 undefined,而不是 null。这两个值是有区别的,请看《JavaScritp 权威指南》的相关内容。最好明确地写为:
return null;
这个问题同样在传递参数时候也会出现,例如:
JavaScript代码:
function func(v1, v2) {
alert(v2);
}
func(1);
alert 显示 v2 的值是 undefined。
虽然在 JavaScript中:
undefined == null;
得到的结果是 true,将一个 typeof 为 "undefined" 的标识符与 null 做等值比较结果也是 true,似乎这两个值可以混用。但是为了理解的清晰,最好还是把这两个值区分开。
还有一个需要注意的是在 SP2 以前版本的 IE5 中,不能直接拿 undefined 与其它值比较,例如:
JavaScript代码:
if(v2 == undefined) {
...
}
在 SP3 以上版本的 IE5、IE6 都没问题,但是在 SP2 版本前的 IE5 中无法执行。必须要写成:
java代码:
if(typeof v2 == "undefined") {
...
}