这几天做Ajax,顺便研究了一下Javascript,发现以前对Javascript是完全不了解=.=

总结如下(以下简称Js):

1、Js中没有Class,只有Function,一个Function可以看成一个类的构造函数,new Function即new Class。每个Function有一个对象prototype,new Function的时候,自动把这个Function的prototype复制到新的对象中。

2、Function中可以使用this关键字,指代的是包含这个Function的类,不过this是动态绑定的,比如

var x = {
    value:"x",
    a:function(){
        alert(this.value);
    }
};
var y = {
    value:"y",
    a:x.a
};
y.a();

运行结果是y。这种模式在Lua中见过,如果要让运行结果是x,要对x.a做一个Binder,显示指定this为x,并调用a.x.apply(obj, …)。

3、Js中没有继承,要实现继承的功能,有N种比较猥琐的方法。一种是在新的对象中放一个base指针,指向它的父类。还有一种是复制prototype。不过看上去都很恶心。以前看过Lua中有一种继承的方法是做一个索引表,调用函数的时候查找它父类的函数,不过Js不支持运算符重载=.=

4、Js中唯一的网络组件是XMLHttpRequest,在IE7和Firefox 中可用,IE6要用new ActiveXObject(“Msxml2.XMLHTTP”)。XMLHttpRequest可以产生一个异步通讯的线程,是Ajax的主要工具之一。线程的管理依赖于浏览器,具体的说明可以看Ray的一篇文章

5、Js中数值0等价于false,也就是if (0){}等价于if (false){},在写Array.Contains的时候总算明白了为什么Lua中0不等价于false,因为Array.Contains可以返回null表示没有找到,而调用的时候可以写If (obj.Contains(val)){},而不用写if (obj.Contains(val)!=null){},但是Js中就只有写后一种了=.=

6、Js中有delete关键字,但不是用来进行垃圾回收的,只能用来在类中删除一个元素。垃圾回收是自动的。

7、Js中有很多保留字(因为ECMA规范的缘故),比如class,IE7会认为var class=0是错误而停止执行。

8、Firefox中的String重载了[]运算符,等价于charAt,但这不是标准。

9、Js和Java同宗,N多相似的地方,比如Date中月份从0开始,0表示一月;String是不可变类;函数的命名和Java几乎完全相同。

10、Firefox下不允许修改Object.prototype,而IE下可以。

先写到这,以后再补……

Related Posts

  1. C#中重载相等运算符