Javascript语言 - akiles

Javascript语言

Javascript语言

一、Javascript语法需要注意的小点

1) 区分大小写。

2) 非编译,而是解释执行。

3) 基于对象,所有的变量都是对象。其中Object是最基本的对象。

4) 注意不同执行环境(不同浏览器)的差异性。

5) 数组、对象、方法是引用型的。

6) 所有变量都采用晚绑定方法。

7) 关键字 this 总是指向调用该方法的对象。

二、Javascript语言的特性

1) 对象

i. 定义:属性的无序集合,每个属性存放一个原始值、对象或函数。

ii. 对象的生命周期:其实也就是变量的生命周期。在其所在的代码块执行完(作用域结束)后,运行无用存储单元收集程序进行销毁不被任何变量引用的对象。所以要想销毁一个对象,先把对其引用的所有变量 = null,这样无用存储单元收集程序就会销毁这个对象。

iii. 官网手册说Javascript有三种对象,本地对象、内置对象、宿主对象。本人觉得应该加上一个自定义类型的对象。因为js的现在已经支持 new操作来构造对象。

iv. 对象中的属性、方法的作用域,js不支持public、protected、private这些。但是开发者可以协商通过命名方式来实现。一般区分private _priVal,public pubVal这两种就够了。

v. 对象中的静态作用域怎么表示?而且要能够通过“类名”(构造函数名)来访问。方法就是,直接通过“类名”来添加属性。别忘了,Function 也是 Object,而且js是晚绑定的。

vi. 在强面向对象语言中,对象是通过类实例化来生成的。而且这种方式很科学。那么怎么在js中模仿这种生成对象的方式呢?

1. Js中的没有class的概念,但是有 new 操作符。我把 new 后面的 Function叫做构造函数。

2. 听官网手册上讲,前人们生成对象走过的路。1,原始的 new object,然后给对象添加属性;2,工厂模式,工厂Function中 return 一个new object;3,new FunctionName ,通过构造函数的方式。

3. 现在一般用的也就是1,3这两种。方法1,用于只需创建一个对象的情况;方法3,用于创建多个对象的情况。

4. 给对象添加属性的方法:1,在构造函数中通过this添加属性;2,用“类名”通过原型来添加属性;3,直接通过对象名来添加属性。

5. 基于对象对属性的需求,非函数属性独有,函数属性(方法)共用。所以,非函数属性在构造函数中添加,方法通过“类名”基于原型来添加。

6. 为了写法上看起来封装性更好,可以用动态原型方法,将基于原型添加方法的代码也写到构造函数中。其原理就是增加一个标记量,根据这个标记量来确定是否执行添加方法的代码。当构造函数执行一次以后,就更改标记量,这样添加方法的代码就只执行一次。

vii. prototype 属性不仅可以定义构造函数的属性和方法,还可以为本地对象添加属性和方法。看看通过修改本地对象可以做些什么?

1. 重写本地对象的方法。注意,通过prototype来重写方法,原方法将会被销毁,所以重写以前最好先添加对原方法的引用。

2. 添加新方法,重命名方法。比如说:我们可以用js 的 Array(表table)来创建一个新的数据类型构造函数,比如堆栈stack、队列queue、树tree。

viii. 纸上得来终觉浅。To be continued

2) Function

i. Function是javascript中的又一“不名物”。但是,你只要抓住它的要害,一切就非常简单,而且还会感觉非常有意思。

ii. 要害一:Function是类,函数是对象。是对象就有属性与方法。它有属性length,表示预期参数的个数,它有方法toString(),valueOf(),返回函数的源代码。Js中的对象是引用型的,函数名只是一个引用了函数对象的变量,所以你可以将两个变量指向同一个函数对象,也可以将函数名 = null,废除函数对象。同时你也要注意重载函数或者方法的写法,它跟强面向对象语言中是不一样的哦。为什么呢?Js中函数对预定义的参数个数不感冒,参数类型更是(变量类型都不用声明)。但是,你也可以实现重载,那就是在函数定义体内部实现。

iii. 要害二:函数对参数不感冒,而且函数定义体内部可以通过arguments这个特殊对象来访问调用函数时传入的参数。注意,arguments也有一个属性length,但是它与函数的属性length是有区别的哦。另外,书上说调用函数最多可以传入25个参数。对于传入的参数与定义体中预期的参数个数不符的情况,缺少的传入undefined,多余的参数将忽略,不过你可以通过arguments这个对象来获取。

iv. 要害三:闭包closure。正常情况下,我们关心的Js中的闭包大多是Function对象产生的。人们对闭包的定义有很多版本。都正确,之所以版本多那是因为定义者关注的点不一样。我理解的闭包,影响了一个变量正常生命周期的Function对象及它的具体引用。它是由一个Function对象 + 这个对象的具体引用情况组成的。一个Function对象,如果它的引用情况不一样,那么它就可能不是闭包。我定义闭包的关注点就是它是否影响了一些变量的正常生命周期。闭包出现还有一个原因就是由于js支持Fucntion对象定义体中嵌套定义Function对象。举一个的例子,

Function func1(){

Var var1 = 1000;

Function func11(){

Return var1 ++;

}

document.getElementById(“action”).onclick = func1;

}

Funct1();
在这个例子中,func1这个Function对象、var1这个数字变量的生命周期都被改变了。

v. To be continued