3.1 面向对象术语
对象(object)定义为属性的无序集合,每个属性存放一个原始值、对象或函数。
每个对象都由类定义,程序使用类创建对象时,生成的对象叫类的实例(instance)。由类创建对象实例的过程叫实例化(instantiation)。
对象定义存放在一个函数——构造函数(constructor)中。
3.1.1 面向对象语言的要求
一种面向对象语言有四种基本能力:
(1)封装——把相关的信息存储在对像中的能力。
(2)聚集——把一个对象存储在另一个对象内的能力。
(3)继承——由另一个类得来类的属性和方法的能力。
(4)多态——编写能以多种方法运行的函数或方法的能力。
3.1.2 对象的构成
在ECMAScript中,对象由特性(attribute)构成,特性可以是原始值,也可以是引用值。如果特性存放的是函数,它将被看作成对象的方法(method),否则该特性被看作是属性(property)。
3.2 对象应用
对象的创建或销毁都在JavaScript执行过程中发生,理解这种范式的含义对理解整个语言至关重要。
3.2.1 声明(Declaration)和实例化(Instantiation)
对象使用关键字new后跟要实例化的类的名字创建的:
var StringObject=new Object();
上述代码创建了Object类的一个实例,并把它存储在变量StringObject中。
3.2.2 对象引用(Object Reference)
不能访问对象的物理表示,只能访问对象的引用。每次创建对象,存储在变量中的都是该对象的引用,而不是对象本身。
3.2.3 对象废除(Dereferencing Object)
ECMAScript有无用存储单元收集程序(garbage collection routine),意味着不必专门销毁对象来释放内存。当再没有对对象的引用时,称该对象被废除(dereference)了。每当函数执行完它的代码,无用存储单元收集程序就会运行,释放所有的局部变量。还可以把对象的所有引用都设置为null,这样可以强制性的废除对象。如果一个对象有两个或更多引用,则要正确废除该对象,必须将其所有引用都设置为null。
3.2.4 早绑定(early binding)和晚绑定(late binding)
绑定,即把对象的接口与对象的实例结合在一起的方法。
早绑定是指在实例化对象之前定义它的特性和方法,这样编译器或解释程序就能提前转换机器代码。ECMAScript中部支持早绑定。
晚绑定指的是编译器或解释程序在运行前,不知道对象的类型。ECMAScript中所有变量都采用晚绑定。
3.3 对象的类型
3.3.1 本地对象(Native Object)
本地对象就是ECMA-262中定义的类(引用类型)。包括
Object | Function | Array | String |
Boolean | Number | Date | RegExp |
Error | EvalError | RangeError | ReferenceError |
SyntaxError | TypeError | URIError |
|
现在介绍两种重要的本地对象Array和Date。
1.Array类
可以用如下方式创建Array对象:
var arrayValue=new Array();
var arrayValue=new Array(20);//定义一个20个项的数组
var arrayValue=new Array(”red”,”green”,”blue”);//创建一个有3个字符串的数组
数组最多可以存放4294967295项,如要添加更多项,会发生异常。
还可以用字面量表示定义Array对象,即用方括号([和]),用逗号分隔值。如:
var arrayValue=[”red”,”green”,”blue”];
方括号的作用是暗示把其中的值存放在Array对象中,用这种方式与用传统方式声明的数组相同。
Array类的一些方法和属性:
l length——返回数组项的个数。
l toString()和valueOf()方法——Array对象覆盖了这两个方法,返回特殊的字符串。调用这两个方法,将返回用逗号把每个数组项连接在一起的字符串。如下例:
var Colors=[“red”,”green”,”blue”];
alert(Colors.toString());//输出 red,green,blue
alert(Colors.valueOf());//输出 red,green,blue
l toLocaleString()方法——返回的是由数组项构成的字符串。与toString()和valueOf()方法的区别是得到的值是通过调用每个数组项的toLocaleString()方法得到的。大多数情况下,该方法返回的值与toString()和valueOf()方法是一样的。
l join()方法——返回用指定的符号连接的数组项构成的字符串。有一个参数,即数组项之间使用的字符串。如下例:
var Colors=[“red”,”green”,”blue”];
alert(Colors.join(“,”));//输出 red,green,blue
alert(Colors.join(“-sping-”));//输出 red-sping-green-sping-blue
l split()方法——把字符串转换成数组。有一个参数,就是被看作数组项之间的分隔符的字符串。如下:
var Colors=”red,green,blue”;
var Colors=Colors.split(“,”);
concat()方法——与String类的concat()方法相似,参数被附加在数组末尾,返回的函数值是新的Array对象(包括原始数组中的项和新的项)。如:
var Colors=[“red”,”green”,”blue”];
var Colors2=Colors.concat(“yellow”,”purple”);
alert(Colors2.toString());//输出 red,green,blue,yellow,purple
alert(Colors.toString());//输出 red,green,blue
l slice()方法——与String类中的该方法非常相似,返回的是具有特定项的新数组。该方法接受一个或两个参数,即要提取的项的起始位置和结束位置。如果只有一个参数,该方法返回从该位置开始到数组结尾的所有项。如果有两个参数,该方法返回第一个位置和第二个位置间的所有项,不包括第二个位置处的项。
var Colors=[“red”,”green”,”blue”,“yellow”,”purple”];
var Colors2=Colors.slice(1);
var Colors3=Colors.slice(1,4);
alert(Colors2.toString());//输出 green,blue,yellow,purple
alert(Colors3.toString());//输出 green,blue,yellow
l push()和pop()方法——这两个方法使Array对象的动作类似一个栈,所以push()方法用于在Array结尾添加一个或多个项,pop()方法用于删除最有一个数组项(length-1),并返回它作为函数值。
l shift()和unshift()方法——这两个方法是用来操作第一项的方法。shift()方法将删除数组中的第一个项,将其作为函数值返回。unshift()方法把一个项放在数组的第一个位置,然后余下的项向下移动一个位置。
l reverse()方法——颠倒数组项的顺序。
l sort()方法——根据数组项的值按升序为它们排序。要进行这种排序,首先会将所有值转换成字符串,然后根据字符代码比较数组项。
l splice()方法——把数据项插入到数组的中部。
2.Date类
ECMAScript把日期存储为距离UTC(Universal Time Code,通用时间代码)时间1970年1月1日凌晨12点的毫秒数。
可用4种方法创建Date对象:
(1)var d=new Date();//用当前日期和时间创建Date对象
(2)var d=new Date(0);//用距离1970年1月1日凌晨12点的毫秒数创建
(3)用parse()方法创建。该方法接受字符串为参数,把该字符串转换为日期值(即毫秒表示)。如果该字符串不能转换成日期,该函数返回NaN。
(3)用UTC()方法创建。它的参数是日期中的年、月、日、小时、分、秒、毫秒。其中,必须声明年和月。
Date类的其余方法:
方 法 | 说 明 |
toString() | 返回由实现特定的字符串,采用人们可读懂的格式 |
valueOf() | 返回日期的毫秒数表示 |
toDateString() | 以实现的特定的格式显示Date的日期部分(即只有月、日、年) |
toTimeString() | 以实现的特定的格式显示Date的时间部分(即小时、分、秒和时区) |
toLocaleString() | 以地点特定的格式显示Date的日期和时间 |
toLocaleDateString() | 以地点特定的格式显示Date的日期部分 |
toLocaleTimeString() | 以地点特定的格式显示Date的时间部分 |
toUTCString() | 以实现的特定的格式显示Date的UTC时间 |
getTimezoneOffset() | 返回当前时区比UTC提前或落后的分钟数,可用来判断时区使用的是否是夏令时 |
getTime() | 返回日期的毫秒表示 |
setTime(milliseconds) | 设置日期的毫秒表示 |
getFullYear() | 返回用四位数表示的日期的年份 |
getUTCFullYear() | 返回用四位数表示的UTC日期的年份 |
setFullYear() | 设置日期的年份,参数必须是四位数的年份值 |
setUTCFullYear() | 设置UTC日期的年份,参数必须是四位数的年份值 |
getMonth() | 返回日期的月份值,由数字0(1月)到11(12月)表示 |
getUTCMonth() | 返回UTC日期的月份值,由数字0(1月)到11(12月)表示 |
setMonth(month) | 设置日期的月份为大于等于0的数字。对于大于11的数字,开始累计年数 |
setUTCMonth(month) | 设置UTC日期的月份为大于等于0的数字。对于大于11的数字,开始累计年数 |
getDate() | 返回该日期该月中的某天 |
getUTCDate() | 返回该UTC日期该月中的某天 |
setDate() | 设置该日期该月中的某天 |
setUTCDate() | 设置该UTC日期该月中的某天 |
getDay() | 返回该日期为星期几 |
getUTCDay() | 返回该UTC日期为星期几 |
setDay(day) | 设置该日期为星期几 |
setUTCDay(day) | 设置该UTC日期为星期几 |
getHours() | 返回日期中的小时值 |
getUTCHours() | 返回UTC日期中的小时值 |
setHours(hours) | 设置日期中的小时值 |
setUTCHours(hours) | 设置UTC日期中的小时值 |
getMinutes() | 返回日期中的分钟值 |
getUTCMinutes() | 返回UTC日期中的分钟值 |
setMinutes(minutes) | 设置日期中的分钟值 |
setUTCMinutes(minutes) | 设置UTC日期中的分钟值 |
getSeconds() | 返回日期中的秒值 |
getUTCSeconds() | 返回UTC日期中的秒值 |
setSeconds(seconds) | 设置日期中的秒值 |
setUTCSeconds(seconds) | 设置UTC日期中的秒值 |
getMilliseconds() | 返回日期中的毫秒值。注意,返回的是当前日期中毫秒值 |
getUTCMilliseconds() | 返回UTC日期中的毫秒值 |
setMilliseconds(milliseconds) | 设置日期中的毫秒值 |
setUTCMilliseconds(milliseconds) | 设置UTC日期中的毫秒值 |
3.3.2 内置对象(Built-in object)
内置对象是指由ECMAScript实现提供的、独立于宿主环境的所有对象,在ECMAScript程序开始执行时出现。这意味着开发者不必明确实例化内置对象,它已被实例化了。标准定义了两个内置对象,每个内置对象都是本地对象。
1.Global对象
Global对象不能实例化,在ECMAScript中,不存在单独的函数,所有的函数必须是某个对象的方法。例如前面的parseInt()和parseFloat()等,看起来都是独立函数,实际上,都是Global对象的方法,它还有一些其它的方法:
encodeURI()方法用于处理完整的URI,它不对URI中的特殊字符进行编码,如冒号、前斜杠、问好和英镑号,所以它可以处理完整的URI。
encodeURIComponent()用于处理URI的一个片断,它对所有非标准字符进行编码,它只能用来处理附加在已有URI末尾的字符串。
decodeURI()和decodeURIComponet()方法用于解码编码过的URI。
eval()方法接受一个参数,即要执行的字符串代码。例如:eval(“alert(‘hi’)”);
Global对象的一些属性:
属性 | 说明 |
undefined | Undefined类型的字面量 |
NaN | 非数的专用数值 |
Infinity | 无穷大值的专用数值 |
Object | 该类型的构造函数 |
Array | 该类型的构造函数 |
Function | 该类型的构造函数 |
Boolean | 该类型的构造函数 |
String | 该类型的构造函数 |
Number | 该类型的构造函数 |
Date | 该类型的构造函数 |
RegExp | 该类型的构造函数 |
Error | 该类型的构造函数 |
EvalError | 该类型的构造函数 |
RangeError | 该类型的构造函数 |
ReferenceError | 该类型的构造函数 |
SyntaxError | 该类型的构造函数 |
TypeError | 该类型的构造函数 |
URIError | 该类型的构造函数 |
2.Math对象
该对象中知道解决最复杂的数学问题的所有公式,如果给它要处理的数字,即能计算出结果。
Math对象的属性:
属性 | 说明 |
E | 值e,自然对数的底 |
LN10 | 10的自然对数 |
LN2 | 2的自然对数 |
LOG2E | 以2为底E的对数 |
LOG10E | 以10为底E的对数 |
PI | 值∏ |
SQRT1_2 | 1/2的平方根 |
SQRT2 | 2的平方根 |
Math对象的方法:
方法 | 属性 |
min() | 判断一组数中的最小值 |
max() | 判断一组数中的最大值 |
abs() | 返回数字的绝对值 |
ceil() | 向上舍入函数,总是把数字向上舍入到最接近的值 |
floor() | 向下舍入函数,总是把数字向下舍入到最接近的值 |
round() | 标准的舍入函数,即四舍五入 |
exp() | 把Math.E升到指定的幂 |
log() | 返回特定数字的自然对数 |
pow() | 把指定的数字升到指定的幂 |
sqrt() | 返回指定数字的平方根 |
acos(x) | 返回x的反余弦值 |
asin(x) | 返回x的反正弦值 |
atan(x) | 返回x的反正切值 |
atan2(y,x) | 返回y/x的反余弦值 |
cos(x) | 返回x的余弦值 |
sin(x) | 返回x的正弦值 |
tan (x) | 返回x的正切值 |
random() | 返回一个0到1之间的随机数,不包括0和1 |
3.3.3 宿主对象(Host object)
所有BOM和DOM都是宿主对象。
3.4 作用域(Scope)
变量的适用范围。
3.4.1 公用、受保护和私有作用域
公用作用域中的对象属性可以从对象外部访问,即开发者创建对象的实例后,就可使用它的公用属性。
私有作用域中的属性只能在对象内部访问,对外部来说,这些属性并不存在。
受保护作用域用来定义私有的属性和方法,但这些属性和方法可以被子类继承。
ECMAScript中只有公有作用域。
3.4.2 静态作用域
静态作用域定义的属性和方法任何时候都能从同一个位置访问。ECMAScript中没有静态作用域。
3.4.3 关键字this
关键字this总是指向调用该方法的对象。