JScript对象
Jscript 对象是属性和方法的集合。一个方法就是一个函数,是对象的成员。属性是一个值或一组值(以数组或对象的形式),是对象的成员。Jscript 支持四种类型的对象:内部对象、生成的对象、宿主给出的对象(如 Internet 浏览器中的 window 和 document)以及 ActiveX 对象(外部组件)。
作为数组的对象
在 Jscript 中,对象和数组几乎是以相同的方式处理的。对象和数组均可以被赋予任意值,实际上数组只是一种特殊的对象。数组和对象的区别在于数组有一个“奇妙的” length 属性,而对象没有。这意味着可以给数组的一个元素赋予比其他元素更大的值。例如,myArray[100] = "hello" — 然后 length 属性将自动地被更新为 101(新长度)。同样,如果修改数组的 length 属性,将删除不再是数组部分的元素。
Jscript 中所有的对象均支持“expando”属性或那些可以在运行时动态添加和删除的属性。这些属性可以有包含数字的任意名称。如果属性的名称是简单的标识符<<参考标识符规则>>,可以在对象名称的后面加句点,例如:
var myObj = new Object(); //
添加两个expando
属性,'name'
和'age'
myObj.name = "Fred";
myObj.age = 42;
如果属性名称不是一个简单的标识符,或者在写脚本的时候不知道,可以在方括号中使用任意表达式来索引属性。在 Jscript 中所有 expando 属性的名称在被添加到对象之前被转换为字符串。
var myObj = new Object(); //
添加两个无法写在object.property
语//
法中的expando
属性。//
第一个属性包含无效字符(空格),//
所以必须写在方括号里。myObj["not a valid identifier"] = "This is the property value";
//
第二个expando
名称是一个数字,//
所以也必须写在方括号里。myObj[100] = "100";
传统的作法是赋给数组元素以 0 开始的数字索引。这些数组元素与 length 属性相交互。然而,由于所有的数组也是对象,也支持 expando 属性。请注意,虽然如此,expando 属性并不以任何方式与 length 属性相交互。例如:
//
三个元素的数组var myArray = new Array(3);
//
添加数据myArray[0] = "Hello";
myArray[1] = 42;
myArray[2] = new Date(2000, 1, 1);
//
显示数组的长度3
window.alert(myArray.length);
//
添加某些expando
属性myArray.expando = "JScript!";
myArray["another Expando"] = "Windows";
//
仍然显示3
,因为两个expando
属性//
并不影响长度。window.alert(myArray.length);
虽然 Jscript 并不直接支持多维数组,但是可以在数组元素中存储任意种类的数据 — 包含其他数组。所以通过在另一个数组的元素里存储其他数组可以得到多维数组的特性。例如,下面的代码为最大为 5 的数字建立了乘法表:
//
若是更大的表请改变本数var iMaxNum = 5;
//
循环计数var i, j;
//
新数组。由于数组从0
开始计数,//
而不是1
,所以数组大小为iMaxNum + 1
。var MultiplicationTable = new Array(iMaxNum + 1);
//
为每个主要的数做循环(表中的每一行)for (i = 1; i <= iMaxNum; i++)
{
//
生成表中的列MultiplicationTable[i] = new Array(iMaxNum + 1);
//
将乘法的结果存在行中for (j = 1; j <= iMaxNum; j++)
{
MultiplicationTable[i][j] = i * j;
}
}
window.alert(MultiplicationTable[3][4]); //
显示12
window.alert(MultiplicationTable[5][2]); //
显示10
window.alert(MultiplicationTable[1][4]); //
显示4
创建自己的对象
要创建自己的对象实例,必须首先为其定义一个构造函数。构造函数创建一个新对象,赋予对象属性,并在合适的时候赋予方法。例如,下面的示例为 pasta 对象定义了构造函数。注意 this 关键字的使用,它指向当前对象。
// pasta
是有四个参数的构造器。function pasta(grain, width, shape, hasEgg)
{//
是用什么粮食做的?this.grain = grain;
//
多宽?(数值)this.width = width;
//
横截面形状?(字符串)this.shape = shape;
//
是否加蛋黄?(boolean
)this.hasEgg = hasEgg;
}
定义了对象构造器后,用 new 运算符创建对象实例。
var spaghetti = new pasta("wheat", 0.2, "circle", true); var linguine = new pasta("wheat", 0.3, "oval", true);
可以给对象实例添加属性以改变该实例,但是用相同的构造器生成的其他对象定义中并不包括这些属性,而且除非你特意添加这些属性那么在其他实例中并不显示出来。如果要将对象所有实例的附加属性显示出来,必须将它们添加到构造函数或构造器原型对象(原型在高级文档中讨论)中。
// spaghetti
的附加属性。spaghetti.color = "pale straw";
spaghetti.drycook = 7;
spaghetti.freshcook = 0.5;
var chowFun = new pasta("rice", 3, "flat", false);
// chowFun
对象或其他现有的pasta
对象//
都没有添加到spaghetti
对象//
的三个新属性。//
将属性‘foodgroup
’加到pasta
原型对象//
中,这样pasta
对象的所有实例都可以有该属性,//
包括那些已经生成的实例。pasta.prototype.foodgroup = "carbohydrates"
//
现在spaghetti.foodgroup
、chowFun.foodgroup
,等等//
均包含值“carbohydrates
”。在定义中包含方法
可以在对象的定义中包含方法(函数)。一种方法是在引用别处定义的函数的构造函数中添加一个属性。例如,下面的示例扩充上面定义的 pasta 构造函数以包含 toString 方法,该方法将在显示对象的值时被调用。
// pasta
是有四个参数的构造器。//
第一部分与上面相同。function pasta(grain, width, shape, hasEgg)
{//
用什么粮食做的?this.grain = grain;
//
多宽?(数值)this.width = width;
//
横截面形状?(字符串)this.shape = shape;
//
是否加蛋黄?(boolean
)this.hasEgg = hasEgg;
//
这里添加toString
方法(如下定义)。//
注意在函数的名称后没有加圆括号;//
这不是一个函数调用,而是//
对函数自身的引用。this.toString = pastaToString;
}//
实际的用来显示past
对象内容的函数。
function pastaToString()
{
//
返回对象的属性。return "Grain: " + this.grain + "/n" +
"Width: " + this.width + "/n" + "Shape: " + this.shape + "/n" +
"Egg?: " + Boolean(this.hasEgg);
}
var spaghetti = new pasta("wheat", 0.2, "circle", true);
//
将调用toString()
并显示spaghetti
对象//
的属性(需要Internet
浏览器)。window.alert(spaghetti);
内部对象
Microsoft Jscript 提供了 11 个内部(或“内置”)对象。它们是Array、Boolean、Date、Function、Global、Math、Number、Object、RegExp、Error 以及 String 对象。每一个对象有相关的方法和属性,这在语言参考中有详细的描述。本节中也描述了某些对象。
Array 对象
数组下标可以被认为是对象的属性,它是通过数字索引来引用的。注意添加到数组中的已命名的属性不能通过数字来索引;它们是与数组元素分离的。
使用 new 运算符和 Array() 构造器 生成一个新的数组,如下面的示例。
var theMonths = new Array(12); theMonths[0] = "Jan"; theMonths[1] = "Feb"; theMonths[2] = "Mar"; theMonths[3] = "Apr"; theMonths[4] = "May"; theMonths[5] = "Jun"; theMonths[6] = "Jul"; theMonths[7] = "Aug"; theMonths[8] = "Sep"; theMonths[9] = "Oct"; theMonths[10] = "Nov"; theMonths[11] = "Dec";
用关键字 Array 生成数组时,Jscript 包含了 length 属性,该属性记录了数组入口数。如果没有给该属性指定值,则设置长度为 0 且数组没有入口点。如果指定一个数值,则将长度设置为该数。如果指定了不止一个参数,则这些参数被用作数组的入口。另外,参数的数目被赋给 length 属性。如下面的示例与前一个示例是等价的。
var theMonths = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
当向用关键字 Array 生成的数组中添加元素时,Jscript 自动改变属性 length 的值。Jscript 中的数组索引总是以 0 开始,而不是 1,所以属性 length 通常比数组的最大索引大 1。
String对象
在 Jscript 中,可以将字符串(和数)当作对象来处理。string 对象 有一些内置方法,可以和自己的字符串一起使用。其中一个是substring 方法,它返回字符串的一部分。该方法以两个数字作为参数。
aString = "0123456789"; var aChunk = aString.substring(4, 7); //
将aChunk
设为"456"
。var aNotherChunk = aString.substring(7, 4); //
将aNotherChunk
设为"456"
。//
使用上面生成数组的示例:firstLetter = theMonths[5].substring(0,1); //
将变量firstLetter
设为“J
”。String 对象的另一个属性是 length 属性。本属性包含了字符串中的字符数(空字符串为 0)。它是一个数值,可以直接在计算中使用。
var howLong = "Hello World".length //
设置变量howLong
为11
。Math 对象
Math 对象有许多预定义属性和方法。属性是特殊的数字。这些特殊的数字之一是 pi 值(近似 3.14159…)。这是 Math.PI 属性,如下例所示。
//
声明一个半径变量并赋数值。var circleArea = Math.PI * radius * radius; //
注意Math
和PI
大写。Math 对象的一个内置方法是乘幂方法(或 pow),使用该方法求得指定数的幂次。下面的例子同时使用了 pi 和乘幂。
//
本公式计算给定半径的球体的体积。volume = (4/3)*(Math.PI*Math.pow(radius,3));
Date 对象
Date 对象可以被用来表示任意的日期和时间,获取当前系统日期以及计算两个日期的间隔。它拥有一些预定义的属性和方法。通常,Date 对象给出星期;月份,天数和年份;以及以小时,分钟和秒表示的时间。该信息是基于 1970 年1 月 1 日 00:00:00.000 GMT 开始的毫秒数,其中 GMT 是格林威治标准时间(首选术语是 UTC,或者“全球标准时间”,它引用的信号是由“世界时间标准”发布的)。Jscript 可以处理 250,000 B.C. 到 255,000 A.D范围内的日期。
使用 new 运算符创建一个新的 Date 对象。下面的示例计算当年已过去的天数和今年剩下的天数。
/*
本示例使用前面定义的月份名称数组。 第一条语句以“Day Month Date 00:00:00 Year
”格式 对thisIsToday
变量赋值。*/
var thisIsToday = new Date();
var toDay = new Date(); //
获取今天的日期。//
提取年,月,日。var thisYear = toDay.getFullYear();
var thisMonth = theMonths[toDay.getMonth()];
var thisDay = thisMonth + " " + toDay.getDate() + ", " + thisYear;
Number 对象
除了 Math 对象中可用的特殊数值属性(例如 PI)外,在 Microsoft Jscript 中, Number 对象有几个其他的数值属性。
属性 | 描述 |
---|---|
MAX_VALUE | 可能的最大数大约为 1.79E+308;可以是正数或负数。(具体数值随系统不同而有微小差别。) |
MIN_VALUE | 可能的最小数大约为 2.22E-308;可以是正数或负数。(具体数值随系统不同而有微小差别。) |
NaN | 特殊非数量值,“不是数值”。 |
POSITIVE_INFINITY | 比最大正数(Number.MAX_VALUE)还要大的任意正值自动被转换为此值,代表正无穷大。 |
NEGATIVE_INFINITY | 比最小的负数(负的 Number.MAX_VALUE)还小的任意值被自动转换为此值,代表负无穷。 |
Number.NaN 是一个特殊的属性,被定义为“不是数值”。例如被 0 除返回 NaN。试图解析一个无法被解析为数字的字符串同样返回 Number.NaN。把 NaN 与任何数值或本身作比较的结果都是不相等。不能通过与 Number.NaN 比较来测试 NaN 结果,而应该使用 isNaN() 函数。