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, ""); // 用Regex將前後空格
}
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。可選項。函數接收的參數列表。
-body。可選項。包含調用該函數時被執行的 JScript 代碼塊的字串。
說明:函數 JScript 中的基礎資料型別 (Elementary Data Type)。文法 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。可選項。任意一種 JScript 基礎資料型別 (Elementary Data Type)。(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 屬性。可以象該例中那樣為原型添加功能,但該對象不能被賦予不同的原型。然而,使用者定義物件可以被賦給新的原型。
-------------------
apply 方法:應用某一對象的一個方法,用另一個對象替換當前對象。
apply([thisObj[,argArray]])
參數:-thisObj。可選項。將被用作當前對象的對象。
-argArray。可選項。將被傳遞給該函數的參數數組。
說明:如果 argArray 不是一個有效數組或者不是 arguments 對象,那麼將導致一個 TypeError。
如果沒有提供 argArray 和 thisObj 任何一個參數,那麼 Global 對象將被用作 thisObj, 並且無法被傳遞任何參數。
要求:版本5.5或以上。
-------------------
call 方法:調用一個對象的一個方法,以另一個對象替換當前對象。
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
參數:-thisObj。可選項。將被用作當前對象的對象。
-arg1, arg2, , argN。可選項。將被傳遞方法參數序列。
說明: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,其中的斜杠也將被編碼。這樣一來,當該編碼結果被作為請求發送到 網頁伺服器時將是無效的。如果字串中包含不止一個 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。可選項。要在其上遍曆的對象或數組。
-statement。可選項。相對於 object 的每個屬性或 array 的每個元素,都要被執行的一個或多個語句。可以是複合陳述式。
說明:在迴圈的每次迭代前,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。可選項。該 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。可選項。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。可選項。將插入到該 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或以上。