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