JavaScript中的高級特性及特別對象
一,編寫構造函數(shù)可以使用 new 運算符結合像 Object()、Date() 和 Function() 這樣的預定義的構造函數(shù)來創(chuàng)建對象并對其初始化。面向對象的編程其強有力的特征是定義自定義構造函數(shù)以創(chuàng)建腳本中使用的自定義對象的能力。創(chuàng)建了自定義的構造函數(shù),這樣就可以創(chuàng)建具有已定義屬性的對象。下面是自定義函數(shù)的示例(注意 this 關鍵字的使用)。
function Circle (xPoint, yPoint, radius) {
??? this.x = xPoint;? // 圓心的 x 坐標
??? this.y = yPoint;? // 圓心的 y 坐標
??? this.r = radius;? // 圓的半徑
}
調用 Circle 構造函數(shù)時,給出圓心點的值和圓的半徑(所有這些元素是完全定義一個獨特的圓對象所必需的)。結束時 Circle 對象包含三個屬性。下面是如何例示 Circle 對象。
var aCircle = new Circle(5, 11, 99);
二,使用原型來創(chuàng)建對象
在編寫構造函數(shù)時,可以使用原型對象(它本身是所有構造函數(shù)的一個屬性)的屬性來創(chuàng)建繼承屬性和共享方法。原型屬性和方法將按引用復制給類中的每個對象,因此它們都具有相同的值。可以在一個對象中更改原型屬性的值,新的值將覆蓋默認值,但僅在該實例中有效。屬于這個類的其他對象不受此更改的影響。下面給出了使用自定義構造函數(shù)的示例,Circle(注意 this 關鍵字的使用)。
Circle.prototype.pi = Math.PI;
function ACirclesArea () {
? return this.pi * this.r * this.r; // 計算圓面積
}
Circle.prototype.area = ACirclesArea; // 計算圓面積的函數(shù)現(xiàn)在是 Circle Prototype 對象的一個方法
var a = ACircle.area();???????? // 此為如何在 Circle 對象上調用面積函數(shù)
使用這個原則,可以給預定義的構造函數(shù)(都具有原型對象)定義附加屬性。例如,如果想要能夠刪除字符串的前后空格(與 VBScript 的 Trim 函數(shù)類似),就可以給 String 原型對象創(chuàng)建自己的方法。
// 增加一個名為 trim 的函數(shù)作為
// String 構造函數(shù)的原型對象的一個方法。
String.prototype.trim = function() {
? return this.replace(/(^\s*)|(\s*$)/g, "");?? // 用正則表達式將前后空格
}
var s = "??? leading and trailing spaces??? "; // 有空格的字符串
window.alert(s + " (" + s.length + ")");
s = s.trim();????????????????????????????????? // 刪除前后空格
window.alert(s + " (" + s.length + ")");
三,特別對象、屬性和方法
Error 對象:保存有關錯誤的信息。
var newErrorObj = new Error()
var newErrorObj = new Error(
? number
)
var newErrorObj = new Error(
? number,
? description
)
Error 對象的構造函數(shù)語法有以下部分:
參數(shù):-number。與錯誤相聯(lián)的數(shù)字值。如果省略則為零。
????? -description。描述錯誤的簡短字符串。如果省略則為空字符串。
說明:每當產(chǎn)生運行時錯誤,就產(chǎn)生 Error 對象的一個實例以描述錯誤。該實例有兩個固有屬性保存錯誤的描述(description 屬性)和錯誤號(number 屬性)。
錯誤號是 32 位的值。高 16 位字是設備代碼,而低字是實際的錯誤代碼。
Error 對象也可以用如上所示的語法顯式創(chuàng)建,或用 throw 語句拋掉。在兩種情況下,都可以添加選擇的任何屬性,以拓展 Error 對象的能力。
典型地,在 try...catch 語句中創(chuàng)建的局部變量引用隱式創(chuàng)建的 Error 對象。因此,可以按選擇的任何方法使用錯誤號和描述。
下面的例子演示了隱式創(chuàng)建 Error 對象的使用:
try {
? x = y;???????????????????????????? // 產(chǎn)生錯誤。
} catch(e) {???????????????????????? // 創(chuàng)建局部變量 e。
? response.write(e)????????????????? // 打印 "[object Error]".
? response.write(e.number & 0xFFFF)? // 打印 5009。
? response.write(e.description)????? // 打印 "'y' is undefined".
}
Function 對象:創(chuàng)建新的函數(shù)。
語法 1
function functionName([argname1 [, ...[, argnameN]]]) {
?? //body
}
語法 2
functionName = new Function( [argname1, [... argnameN,]] body );
參數(shù):-functionName。必選項。最新創(chuàng)建函數(shù)的名稱
????? -argname1...argnameN。可選項。函數(shù)接收的參數(shù)列表。
????? -body。可選項。包含調用該函數(shù)時被執(zhí)行的 JScript 代碼塊的字符串。
說明:函數(shù) JScript 中的基本數(shù)據(jù)類型。語法 1 創(chuàng)建在必要時由 JScript 轉換為 Function 對象的函數(shù)值。JScript 在調用函數(shù)時將用語法 2 創(chuàng)建的函數(shù)轉換為 Fnction 對象。
語法 1 是 JScript 中創(chuàng)建函數(shù)的基本方法。語法 2 是用于顯式創(chuàng)建函數(shù)對象的另一方法。
例如,要創(chuàng)建將傳遞給它的兩個參數(shù)相加的函數(shù),可以用兩種方法中的任一種完成:
例子 1
function add(x, y) {
? return(x + y);??????????? // 執(zhí)行加法并返回結果。
}
例子 2
var add = new Function("x", "y", "return(x+y)");
在兩種情況下,都可以用如下代碼行調用該函數(shù):
add(2, 3);
注意?? 在調用函數(shù)時,請確保包含了括號和必需的參數(shù)。調用函數(shù)時不用括號導致返回函數(shù)的文本而不是函數(shù)執(zhí)行的結果。
Object 對象:提供所有 JScript 對象通用的功能。
obj = new Object([value])
參數(shù):-obj。必選項。要賦值為 Object 對象的變量名。
????? -value。可選項。任意一種 JScript 基本數(shù)據(jù)類型。(Number、Boolean、或 String。)如果 value 為一個對象,返回不作改動的該對象。如果 value 為 null、undefined,或者沒有給出,則產(chǎn)生沒有內(nèi)容的對象。
說明:Object 對象被包含在所有其它 JScript 對象中;在所有其它對象中它的方法和屬性都是可用的。在用戶定義的對象中可以重定義這些方法,并在適當?shù)臅r候通過 JScript 調用。toString 方法是經(jīng)常被重定義的 Object 方法的例子。
arguments 屬性:為當前執(zhí)行的 function 對象返回一個arguments 對象。
function.arguments
function 參數(shù)是當前執(zhí)行函數(shù)的名稱,可以省略。
說明:通過 arguments 屬性,函數(shù)可以處理可變數(shù)量的參數(shù)。 arguments 對象的 length 屬性包含了傳遞給函數(shù)的參數(shù)的數(shù)目。對于arguments 對象所包含的單個參數(shù),其訪問方法與數(shù)組中所包含的參數(shù)的訪問方法相同。
示例:下面的例子說明了 arguments 屬性的用法:
function ArgTest() {
?? var i, s, numargs = arguments.length;
?? s = numargs;?
?? if (numargs < 2)
???? s += " argument was passed to ArgTest. It was ";
?? else
???? s += " arguments were passed to ArgTest. They were " ;
?? for (i = 0; i < numargs; i++) {
???? s += arguments[i] + " ";
?? }
?? return(s);
}
callee 屬性:返回正被執(zhí)行的 Function 對象,也就是所指定的 Function 對象的正文。
[function.]arguments.callee
可選項 function 參數(shù)是當前正在執(zhí)行的 Function 對象的名稱。
說明:callee 屬性是 arguments 對象的一個成員,僅當相關函數(shù)正在執(zhí)行時才可用。
callee 屬性的初始值就是正被執(zhí)行的 Function 對象。這允許匿名的遞歸函數(shù)。
示例:
function factorial(n) {
?if (n <= 0)
?? return 1;
?else
? return n * arguments.callee(n - 1)
}
print(factorial(3));
要求:版本5.5或以上。
caller 屬性:返回一個對函數(shù)的引用,該函數(shù)調用了當前函數(shù)。
functionName.caller
functionName 對象是所執(zhí)行函數(shù)的名稱。
說明:對于函數(shù)來說,caller 屬性只有在函數(shù)執(zhí)行時才有定義。 如果函數(shù)是由 JScript 程序的頂層調用的,那么 caller 包含的就是 null 。
如果在字符串上下文中使用 caller 屬性,那么結果和 functionName.toString 一樣,也就是說,顯示的是函數(shù)的反編譯文本。
下面的例子說明了 caller 屬性的用法:
function CallLevel() {
? if (CallLevel.caller == null)
??? return("CallLevel was called from the top level.");
? else
??? return("CallLevel was called by another function.");
}
constructor 屬性:表示創(chuàng)建對象的函數(shù)。
object.constructor
必需的 object是對象或函數(shù)的名稱。
說明:constructor 屬性是所有具有 prototype 的對象的成員。它們包括除 Global 和 Math 對象以外的所有 JScript 固有對象。constructor 屬性保存了對構造特定對象實例的函數(shù)的引用。
例如:
x = new String("Hi");
if (x.constructor == String) // 進行處理(條件為真)。
或
function MyFunc {
?? // 函數(shù)體。
}
y = new MyFunc;
if (y.constructor == MyFunc) // 進行處理(條件為真)。
description 屬性:返回或設置與特定錯誤相聯(lián)系的描述字符串。
object.description [= stringExpression]
description 屬性的語法組成部分如下:
參數(shù):-object。必選項。Error 對象的任意實例。
????? -stringExpression。可選項。包含錯誤描述的字符串表達式。
說明:description 屬性包含與特定錯誤相聯(lián)系的錯誤信息字符串。使用包含在這個中的值,來警告用戶發(fā)生了一個不能或不想處理的錯誤。
prototype 屬性:返回對象類型原型的引用。
objectName.prototype
objectName 參數(shù)是對象的名稱。
說明:用 prototype 屬性提供對象的類的一組基本功能。 對象的新實例“繼承”賦予該對象原型的操作。
例如,要為 Array 對象添加返回數(shù)組中最大元素值的方法。 要完成這一點,聲明該函數(shù),將它加入 Array.prototype, 并使用它。
function array_max( ) {
? var i, max = this[0];
? for (i = 1; i < this.length; i++) {
??? if (max < this[i])
????? max = this[i];
? }
? return max;
}
Array.prototype.max = array_max;
var x = new Array(1, 2, 3, 4, 5, 6);
var y = x.max( );
該代碼執(zhí)行后,y 保存數(shù)組 x 中的最大值,或說 6。
所有 JScript 固有對象都有只讀的 prototype 屬性。可以象該例中那樣為原型添加功能,但該對象不能被賦予不同的原型。然而,用戶定義的對象可以被賦給新的原型。
apply 方法:應用某一對象的一個方法,用另一個對象替換當前對象。
apply([thisObj[,argArray]])
參數(shù):-thisObj。可選項。將被用作當前對象的對象。
????? -argArray。可選項。將被傳遞給該函數(shù)的參數(shù)數(shù)組。
說明:如果 argArray 不是一個有效的數(shù)組或者不是 arguments 對象,那么將導致一個 TypeError。
如果沒有提供 argArray 和 thisObj 任何一個參數(shù),那么 Global 對象將被用作 thisObj, 并且無法被傳遞任何參數(shù)。
要求:版本5.5或以上。
call 方法:調用一個對象的一個方法,以另一個對象替換當前對象。
call([thisObj[,arg1[, arg2[,?? [,.argN]]]]])
參數(shù):-thisObj。可選項。將被用作當前對象的對象。
????? -arg1, arg2,? , argN。可選項。將被傳遞方法參數(shù)序列。
說明:call 方法可以用來代替另一個對象調用一個方法。call 方法可將一個函數(shù)的對象上下文從初始的上下文改變?yōu)橛?thisObj 指定的新對象。
如果沒有提供 thisObj 參數(shù),那么 Global 對象被用作 thisObj。
要求:版本5.5或以上。
concat 方法 (Array):返回一個新數(shù)組,這個新數(shù)組是由兩個或更多數(shù)組組合而成的。
array1.concat([item1[, item2[, . . . [, itemN]]]])
參數(shù):-array1。必選項。其他所有數(shù)組要進行連接的 Array 對象。
????? -item1,. . ., itemN。可選項。要連接到 array1 末尾的其他項目。
說明:concat 方法返回一個 Array 對象,其中包含了 array1 和提供的任意其他項目的連接。
要加的項目(item1 … itemN)會按照從左到右的順序添加到數(shù)組。如果某一項為數(shù)組,那么添加其內(nèi)容到 array1 的末尾。如果該項目不是數(shù)組,就將其作為單個的數(shù)組元素添加到數(shù)組的末尾。
以下為從源數(shù)組復制元素到結果數(shù)組:
對于從正被連接到新數(shù)組的數(shù)組中復制的對象參數(shù),復制后仍然指向相同的對象。不論新數(shù)組和源數(shù)組中哪一個有改變,都將引起另一個的改變。
對于連接到新數(shù)組的數(shù)值或字符串,只復制其值。一個數(shù)組中值有改變并不影響另一個數(shù)組中的值。
示例:下面這個例子說明了使用數(shù)組時 concat 方法的用法:
function ConcatArrayDemo() {
? var a, b, c, d;
? a = new Array(1,2,3);
? b = "JScript";
? c = new Array(42, "VBScript);
? d = a.concat(b, c);? // 返回數(shù)組 [1, 2, 3, "JScript", 42, "VBScript"]
? return(d);
}
escape 方法:對 String 對象編碼以便它們能在所有計算機上可讀。
escape(charString)
必選項 charstring 參數(shù)是要編碼的任意 String 對象或文字。
說明:escape 方法返回一個包含了 charstring 內(nèi)容的字符串值( Unicode 格式)。所有空格、標點、重音符號以及其他非 ASCII 字符都用 %xx 編碼代替,其中 xx 等于表示該字符的十六進制數(shù)。例如,空格返回的是 "%20" 。
字符值大于 255 的以 %uxxxx 格式存儲。
注意:escape 方法不能夠用來對統(tǒng)一資源標示碼 (URI) 進行編碼。對其編碼應使用 encodeURI 和encodeURIComponent 方法。
unescape 方法:解碼用 escape 方法進行了編碼的 String 對象。
unescape(charstring)
必選項 charstring 參數(shù)是要解碼的 String 對象。
說明:unescape 方法返回一個包含 charstring 內(nèi)容的字符串值。所有以 %xx 十六進制形式編碼的字符都用 ASCII 字符集中等價的字符代替。
以 %uxxxx 格式(Unicode 字符)編碼的字符用十六進制編碼 xxxx 的 Unicode 字符代替。
注意:unescape 方法不能用于解碼統(tǒng)一資源標識碼 (URI)。解該碼可使用 decodeURI 和 decodeURIComponent 方法。
eval 方法:檢查 JScript 代碼并執(zhí)行。
eval(codeString)
必選項 codestring 參數(shù)是包含有效 JScript 代碼的字符串值。這個字符串將由 JScript 分析器進行分析和執(zhí)行。
說明:eval 函數(shù)允許 JScript 源代碼的動態(tài)執(zhí)行。例如,下面的代碼創(chuàng)建了一個包含 Date 對象的新變量 mydate :
eval("var mydate = new Date();");
傳遞給 eval 方法的代碼執(zhí)行時的上下文和調用 eval 方法的一樣.
encodeURI 方法:將文本字符串編碼為一個有效的統(tǒng)一資源標識符 (URI)。
encodeURI(URIString)
必選的 URIString 參數(shù)代表一個已編碼的 URI。
說明:encodeURI 方法返回一個編碼的 URI。如果您將編碼結果傳遞給 decodeURI,那么將返回初始的字符串。encodeURI 方法不會對下列字符進行編碼:":"、"/"、";" 和 "?"。請使用 encodeURIComponent 方法對這些字符進行編碼。
要求:版本5.5或以上。
decodeURI 方法:返回一個已編碼的統(tǒng)一資源標識符 (URI) 的非編碼形式。
decodeURI(URIstring)
必要的 URIstring 參數(shù)代表一個已編碼 URI 的值。
說明:使用 decodeURI 方法代替已經(jīng)過時的 unescape 方法。
decodeURI 方法返回一個字符串值。
如果 URIString 無效,那么將產(chǎn)生一個 URIError。
要求:版本5.5或以上。
encodeURIComponent 方法:將文本字符串編碼為一個統(tǒng)一資源標識符 (URI) 的一個有效組件。
encodeURIComponent(encodedURIString)
必選的 encodedURIString 參數(shù)代表一個已編碼的 URI 組件。
說明:encodeURIComponent 方法返回一個已編碼的 URI。如果您將編碼結果傳遞給 decodeURIComponent,那么將返回初始的字符串。因為 encodeURIComponent 方法對所有的字符編碼,請注意,如果該字符串代表一個路徑,例如 /folder1/folder2/default.html,其中的斜杠也將被編碼。這樣一來,當該編碼結果被作為請求發(fā)送到 web 服務器時將是無效的。如果字符串中包含不止一個 URI 組件,請使用 encodeURI 方法進行編碼。
要求:版本5.5或以上。
decodeURIComponent 方法:返回統(tǒng)一資源標識符 (URI) 的一個已編碼組件的非編碼形式。
decodeURIComponent(encodedURIString)
必選的 encodedURIString 參數(shù)代表一個已編碼的 URI 組件。
說明:URIComponent 是一個完整的 URI 的一部分。
如果 encodedURIString 無效,將產(chǎn)生一個 URIError。
要求:版本5.5或以上。
for...in 語句:對應于一個對象的每個,或一個數(shù)組的每個元素,執(zhí)行一個或多個語句。
for (variable in [object | array])
?? statements
參數(shù):-variable。必選項。一個變量,它可以是 object 的任一屬性或 array 的任一元素。
????? -object, array。可選項。要在其上遍歷的對象或數(shù)組。
????? -statement。可選項。相對于 object 的每個屬性或 array 的每個元素,都要被執(zhí)行的一個或多個語句。可以是復合語句。
說明:在循環(huán)的每次迭代前,variable 被賦予 object 的下一個屬性或 array 的下一個元素。然后可以在循環(huán)內(nèi)的任一語句中使用它,就好像正在使用 object 的該屬性或 array 的該元素一樣。
當在一個對象上迭代時,沒有辦法決定或控制把對象的成員賦給 variable 的次序。在數(shù)組內(nèi)將按元素的次序執(zhí)行迭代,也就是,0、1、2、......
示例:下面示例說明了 for ... in 語句的用法,它把一個對象用作一個聯(lián)合數(shù)組:
function ForInDemo() {
? var a, key, s = "";???????????????????????????????????? // 創(chuàng)建某些變量
? a = {"a" : "Athens" , "b" : "Belgrade", "c" : "Cairo"}? // 初始化對象
? for (key in a)?? {????????????????????????????????????? // 迭代屬性
???? s += a[key] + "
";
? }
? return(s);
}
join 方法:返回字符串值,其中包含了連接到一起的數(shù)組的所有元素,元素由指定的分隔符分隔開來。
arrayObj.join(separator)
參數(shù):-arrayObj。必選項。Array 對象。
????? -separator。必選項。是一個 String 對象,作為最終的 String 對象中對數(shù)組元素之間的分隔符。如果省略了這個參數(shù),那么數(shù)組元素之間就用一個逗號來分隔。
說明:如果數(shù)組中有元素沒有定義或者為 null,將其作為空字符串處理。
示例:下面這個例子說明了 join 方法的用法。
function JoinDemo() {
? var a, b;
? a = new Array(0,1,2,3,4);
? b = a.join("-");
? return(b);
}
pop 方法:移除數(shù)組中的最后一個元素并返回該元素。
arrayObj.pop( )
必選的 arrayObj 引用是一個 Array 對象。
說明:如果該數(shù)組為空,那么將返回 undefined。
要求:版本5.5或以上。
push 方法:將新元素添加到一個數(shù)組中,并返回數(shù)組的新長度值。
arrayObj.push([item1 [item2 [. . . [itemN ]]]])
參數(shù):-arrayObj。必選項。一個 Array 對象。
????? -item, item2,. . . itemN。可選項。該 Array 的新元素。
說明:push 方法將以新元素出現(xiàn)的順序添加這些元素。如果參數(shù)之一為數(shù)組,那么該數(shù)組將作為單個元素添加到數(shù)組中。如果要合并兩個或多個數(shù)組中的元素,請使用 concat 方法。
要求:版本5.5或以上。
reverse 方法:返回一個元素順序被反轉的 Array 對象。
arrayObj.reverse( )
必選項 arrayObj 參數(shù)為 Array 對象。
說明:reverse 方法將一個 Array 對象中的元素位置進行反轉。在執(zhí)行過程中,這個方法并不會創(chuàng)建一個新的 Array 對象。
如果數(shù)組是不連續(xù)的,reverse 方法將在數(shù)組中創(chuàng)建元素以便填充數(shù)組中的間隔。這樣所創(chuàng)建的全部元素的值都是 undefined。
示例:下面這個例子說明了 reverse 方法的用法:
function ReverseDemo() {
? var a, l;????????????????? // 聲明變量。
? a = new Array(0,1,2,3,4);? // 創(chuàng)建數(shù)組并賦值。
? l = a.reverse();?????????? // 反轉數(shù)組的內(nèi)容。
? return(l);???????????????? // 返回結果數(shù)組。
}
slice 方法 (Array):返回一個數(shù)組的一段。
arrayObj.slice(start, [end])
參數(shù):-arrayObj。必選項。一個 Array 對象。
????? -start。必選項。arrayObj 中所指定的部分的開始元素是從零開始計算的下標。
????? -end。可選項。arrayObj 中所指定的部分的結束元素是從零開始計算的下標。
說明:slice 方法返回一個 Array 對象,其中包含了 arrayObj 的指定部分。
slice 方法一直復制到 end 所指定的元素,但是不包括該元素。如果 start 為負,將它作為 length + start處理,此處 length 為數(shù)組的長度。如果 end 為負,就將它作為 length + end 處理,此處 length 為數(shù)組的長度。如果省略 end ,那么 slice 方法將一直復制到 arrayObj 的結尾。如果 end 出現(xiàn)在 start 之前,不復制任何元素到新數(shù)組中。
示例:在下面這個例子中,除了最后一個元素之外,myArray 中所有的元素都被復制到 newArray 中:
newArray = myArray.slice(0, -1)
shift 方法:移除數(shù)組中的第一個元素并返回該元素。
arrayObj.shift( )
必選的 arrayObj 引用是一個 Array 對象。
說明:shift 方法可移除數(shù)組中的第一個元素并返回該元素。
要求:版本5.5或以上。
unshift 方法:將指定的元素插入數(shù)組開始位置并返回該數(shù)組。
arrayObj.unshift([item1[, item2 [, . . . [, itemN]]]])
參數(shù):-arrayObj。必選項。一個 Array 對象。
????? -item1, item2,. . .,itemN。可選項。將插入到該 Array 開始部分的元素。
說明:unshift 方法將這些元素插入到一個數(shù)組的開始部分,所以這些元素將以參數(shù)序列中的次序出現(xiàn)在數(shù)組中。
要求:版本5.5或以上。
splice 方法:從一個數(shù)組中移除一個或多個元素,如果必要,在所移除元素的位置上插入新元素,返回所移除的元素。
arrayObj.splice(start, deleteCount, [item1[, item2[, . . . [,itemN]]]])
參數(shù):-arrayObj。必選項。一個 Array 對象。
????? -start。必選項。指定從數(shù)組中移除元素的開始位置,這個位置是從 0 開始計算的。
????? -deleteCount。必選項。要移除的元素的個數(shù)。
????? -item1, item2,. . .,itemN。必選項。要在所移除元素的位置上插入的新元素。
說明:splice 方法可以移除從 start 位置開始的指定個數(shù)的元素并插入新元素,從而修改 arrayObj。返回值是一個由所移除的元素組成的新 Array 對象。
要求:版本5.5或以上。