《Javascript语言精粹》读书笔记一

我一直不喜欢Javascript这个语言,直到我看了这么书之后,发现,原来Javascript没有想象的困难。之前讨厌它的原因,说起来也简单,第一,没有一个比较直观的开发环境;第二,之前一直不知道用什么工具来查看BUG;第三,一直以来没能正确理解原型链,以及Javascript最迷人的Function对象,这个对象实在是太有趣了。

总结一下,今天看了一下午书。基本的语法知识,这个只要看看基本就都明白了,我想记录在我博客里的,主要还是一些细节的地方,一些Javascript精粹的地方,省掉一些BYTE。

1、字符串:

Javascript里面没有字符类型,如果要表示一个字符,那么创建一个只包含一个字符的字符串就行了;

Javascript里面的字符串是不可变的,这个我感觉和.NET里面的字符串驻留机制很像。你可以通过“+ ”来连接字符串,这时候就会生成一个新的字符串。

2、Javascript原始类型

a、undefined - 如果变量是 Undefined 类型的

b、boolean - 如果变量是 Boolean 类型的

c、number - 如果变量是 Number 类型的

d、string - 如果变量是 String 类型的

e、object - 如果变量是一种引用类型或 Null 类型的

关于这个,.NET开发人员都知道有一个别名的机制吧?Javascript原始类型,你其实也可以这么理解它。

3、对象字面量:

老实说,在没有看到这本书之前,字面量我是懂的,但是我又忘记了。记得以前大三那阵子学XML的时候,大家都在用ASP等服务器端的语言来操作XML DOM,我用了一两天的时间囫囵吞枣看了一遍Javascript,字面量是会用了,但是Javascript诸多强大灵活的特性,我却是一样都没有用到,那时候写的代码完全没有利用强大无比的闭包特性,匿名对象,以及Function对象的特性,稍微回顾了一下,字面量还是很好理解。比如你编写代码的时候,你可以给你的对象这么编写属性或者方法:

对象字面量示例

4、检索

要检索对象包含的值,我们可以使用[“键名”]来检索,当然,推荐的方式是用“.”。这里有一个很有意思的地方,就是我们尝试去获取对象的某个属性值,且对象没有该属性值,那么Javascript会试着从原型那里检索,如果这个时候对象的原型还是没有这个属性,那么会再次检索对象原型的原型,一直到Object的原型,如果这个时候,仍然没有这个属性,结果就会返回undefined。

5、全局变量

Javascript可以很随意的定义全局变量,但不幸的的是,全局变量会削弱程序的灵活性,应该避免。在Javascript里面进行方法调用的时候,不同的方式,this指针绑定的对象也是有所差别的,比如你以函数的形式来调用方法,this绑定的就是全局对象。记得以前看过一点儿ASP.NET AJAX的源代码,这种方式可以用来实现类似于命名空间的概念,也就是定义一个容器。看看上面的代码,我定义了一个App的容器了。

6、函数调用模式

一共有四种调用模式,方法调用模式、函数调用模式、构造器调用模式、Apply调用模式。书上是这么写的,但是我在看的时候,看到Function还有一个call()方法,和apply()方法相似,这个方法一样可以实现函数的调用的代理。

方法调用模式:这个其实简单,也就是object.function(),这样的话,如果你在function()里面有引用到this,那么这个指针是会被绑定到object的;

函数调用模式:在上文提到过,比如你这么写:var sum = add(3,4);那么this指针就是绑定到全局对象的,至于这个全局对象,我看书的时候仍然不解,哪个全局对象啊?待研究…;

构造器调用模式:这个模式,挺熟悉,但在Javascript里面,这让我觉得很怪异。书上有给出示例:

构造器调用模式

但你完全可以这么写:

构造器调用模式改

这里直接用return返回了一个对象,利用闭包特性,这个对象的get_status()方法是可以访问status这个参数的!在这里,我觉得如果说“()”是运算符一点也不为过。App.Quo实质上就是一个引用,但是如果你用上“()”,那么就执行函数,返回一个对象了!有时候我们也可以利用这个运算符来使我们定义的function马上执行:

“()”运算符

 

在上文中,我反复提到闭包特性,那么什么是闭包?闭包其实很简单,更是强大无比,这特性真的是太有趣了!我们都知道在高级语言里面,变量是有作用域的。在Javascript里,内部函数时可以利用外部函数的参数和定义的变量(this和arguments除外),这就是闭包。Javascript不像JAVA,C#那样有私有成员变量的,你可以定义get和set访问器,Javascript所有的成员都是公开的,说到这里,你是不是想到了什么?是的,利用闭包特性,你完全可以模拟出这个效果!参见前面的“()”运算符的代码。

今天暂时到此为止,其实我看的,远比上面的远了,但后面尚未实践一下,写写几段小程序验证一下,就不写出来了,留到下次。没有实践,没有发言,呵呵。
 

posted @ 2010-03-12 19:17  幸运猴子  阅读(806)  评论(0编辑  收藏  举报