使用JavaScript必须理解的四个关键事实

JavaScript正式名称为ECMAScript,和Java毫无干系,原本是为了实现Web动态效果而设计的一种脚本语言,运行于浏览器的沙盒中,由浏览器引擎负责解释执行。

对于C/C++/Java的程序员来说,JavaScript看上去是一种很熟悉的语言,因为其文法几乎完全借鉴于C——包括大小写敏感的变量命名、标识代码块的花括号、几乎所有的运算符以及代码流的控制等——然而仅仅看上去是,JavaScript在本质上与C系语言大相径庭,以下列出了四个必须理解的关键事实:

1. 弱类型

JavaScript的变量是弱类型的,可以随时定义,定义的时候不需要指定类型,运行的过程中类型可以发生改变,目前支持的类型包括数字、字符串、数组、对象、布尔及未定义。

2. 泛类型的函数

作为实现子程序的一种方式,JavaScript的”函数“具备参数传递、支持返回值等基本特征。此外,作为一级类型,一个函数本身就是一个对象,可以作为参数进行传递、可以充当返回值、也可以赋值给变量或对象的属性、还具备自己的属性及方法——对于JavaScript来说,函数就是一种特殊的对象,其与其他对象的不同之处在于函数可以被调用执行。

以上代码中的函数foo将检查其成员nickname是不是“chicken”,如是则弹出警告框。在接下来的代码中,我们使用变量myfoo引用函数foo,为其增加成员nickname并初始化为“chicken”。因此,当我们接下来同样使用变量myfoo调用函数foo时,警告窗会弹出。

Javascript函数不存在函数原型的问题,其参数列表相当随意,几乎没有任何限制,如下面的代码,在调用write函数时,可以给它任意个参数——这是完全正确的语法,只是某些情况下在运行时可能产生不可预测的错误而已(第三个调用会输出“undefined”),而arguments是函数write的成员,write被调用的时候赋值。

调用一个JavaScript函数有多种方式,包括没有任何前缀的全局函数方式,对象方法的形式,或构造函数的形式。

当把一个函数赋值给某个对象的成员,然后使用对象去调用函数,该函数就成为了特定对象的方法,可以通过this引用对象本身;而如辅以new关键字调用某个函数的话,就会创建一个新的对象,该函数则扮演着构造函数的角色,通过this引用此新建对象并为其添加成员及进行相应初始化。

 

以上代码中的函数foo检查其上下文对象的成员nickname是否等于“chicken”,如是,则弹出警告框。在第一次以全局方式调用函数foo时,由于foo没有上下文对象,故不会弹出警告框;而第二次将函数foo赋值给对象的成员f,并且为该对象的nickname赋值为“chicken”,然后以成员方法的形式调用foo时,则有警告框弹出。

下面的代码同样有警告框弹出,这是因为当一个函数以全局全局方式被调用时其上下文对象为window,函数foo的this指向window,同时window会有一个名为foo的属性引用函数foo。因此,以下对函数foo的调用等价于“window.foo();”。

3. 没有类的对象

JavaScript是面向对象的语言,但不支持类;它允许使用new操作符依照一个函数作为模板来初始化新建对象,体现了某种构造函数的概念,但对象创建之后仍然可以随意添加成员。以下代码创建了一个名为tom的对象,具备年龄和性别两个属性,分别为35和”male”。

在对象构造过程中,函数体内的this即是对新创建的对象的引用,因此,可以通过this统一定义新建对象的属性和方法。以下代码中,tom和jess都是通过使用employee函数来创建的,所以拥有相同的属性和方法。

 

4. 基于属性表和原型职责链的运行方式

JavaScript的运行核心是一个动态的属性表和原型职责链,如上面所述,属性可以在任何时候添加到对象之中,同时,每个JavaScript对象都有一个原型对象,它的属性是可共享的,如果要访问的某一属性当前对象不支持,则会上溯查询原型对象,确认是否支持该属性。这在一定程度上体现了一种继承的概念。多数浏览器支持__proto__属性访问一个对象的原型,但这不是JavaScript定义的标准方式,理论上讲,原型只是一个对象的内部属性,仅供系统追溯时使用。

利用prototype关键字可以引用并修改构造函数挂接到所建对象上的原型对象。在下面的代码中,由于employee函数参照的原型对象被修改了,因此使用该函数创建的对象tom具备了一个新的方法talk,这个方法其实来自于tom对象的原型对象,即tom.__proto__。需要注意的是,开发者必须明确把握自己所作出的修改,否则,在对象的原型被修改之前对某个新增属性的访问会导致一个无效引用的异常——讨厌而不易检测。

prototype本身是JavaScript函数固有的一个属性,类型为对象,缺省情况下,所有由该函数构建的对象的原型都指向这个对象,JavaScript继承机制则可以通过替换这个对象重构职责链而得以实现。

全文出自:http://chunlin.li/tech/doku.php/tech:programming:web

anyShare分享到:

Meta

cli Written by:

Be First to Comment

Leave a Reply