JavaScript中的高级特性及特别对象、属性和方法
一,编写构造函数
可以使用new运算符结合像Object()、Date()和Function()这样的预定义的构造函数来创建对象并对其初始化。面向对象的编程其强有力的特征是定义自定义构造函数以创建脚本中使用的自定义对象的能力。创建了自定义的构造函数,这样就可以创建具有已定义属性的对象。下面是自定义函数的示例(注意this关键字的使用)。
functionCircle(xPoint,yPoint,radius){
this.x=xPoint;//圆心的x坐标
this.y=yPoint;//圆心的y坐标
this.r=radius;//圆的半径
}
调用Circle构造函数时,给出圆心点的值和圆的半径(所有这些元素是完全定义一个独特的圆对象所必需的)。结束时Circle对象包含三个属性。下面是如何例示Circle对象。
varaCircle=newCircle(5,11,99);
二,使用原型来创建对象
在编写构造函数时,可以使用原型对象(它本身是所有构造函数的一个属性)的属性来创建继承属性和共享方法。原型属性和方法将按引用复制给类中的每个对象,因此它们都具有相同的值。可以在一个对象中更改原型属性的值,新的值将覆盖默认值,但仅在该实例中有效。属于这个类的其他对象不受此更改的影响。下面给出了使用自定义构造函数的示例,Circle(注意this关键字的使用)。
Circle.prototype.pi=Math.PI;
functionACirclesArea(){
returnthis.pi*this.r*this.r;//计算圆面积
}
Circle.prototype.area=ACirclesArea;//计算圆面积的函数现在是CirclePrototype对象的一个方法
vara=ACircle.area();//此为如何在Circle对象上调用面积函数
使用这个原则,可以给预定义的构造函数(都具有原型对象)定义附加属性。例如,如果想要能够删除字符串的前后空格(与VBScript的Trim函数类似),就可以给String原型对象创建自己的方法。
//增加一个名为trim的函数作为
//String构造函数的原型对象的一个方法。
String.prototype.trim=function(){
returnthis.replace(/(^\s*)|(\s*$)/g,"");//用正则表达式将前后空格
}
vars="leadingandtrailingspaces";//有空格的字符串
window.alert(s+"("+s.length+")");
s=s.trim();//删除前后空格
window.alert(s+"("+s.length+")");
三,特别对象、属性和方法
-------------------
Error对象:保存有关错误的信息。
varnewErrorObj=newError()
varnewErrorObj=newError(
number
)
varnewErrorObj=newError(
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)//打印"[objectError]".
response.write(e.number&0xFFFF)//打印5009。
response.write(e.description)//打印"'y'isundefined".
}
-------------------
Function对象:创建新的函数。
语法1
functionfunctionName([argname1[,...[,argnameN]]]){
//body
}
语法2
functionName=newFunction([argname1,[...argnameN,]]body);
参数:-functionName。必选项。最新创建函数的名称
-argname1...argnameN。可选项。函数接收的参数列表。
-body。可选项。包含调用该函数时被执行的JScript代码块的字符串。
说明:函数JScript中的基本数据类型。语法1创建在必要时由JScript转换为Function对象的函数值。JScript在调用函数时将用语法2创建的函数转换为Fnction对象。
语法1是JScript中创建函数的基本方法。语法2是用于显式创建函数对象的另一方法。
例如,要创建将传递给它的两个参数相加的函数,可以用两种方法中的任一种完成:
例子1
functionadd(x,y){
return(x+y);//执行加法并返回结果。
}
例子2
varadd=newFunction("x","y","return(x+y)");
在两种情况下,都可以用如下代码行调用该函数:
add(2,3);
注意在调用函数时,请确保包含了括号和必需的参数。调用函数时不用括号导致返回函数的文本而不是函数执行的结果。
-------------------
Object对象:提供所有JScript对象通用的功能。
obj=newObject([value])
参数:-obj。必选项。要赋值为Object对象的变量名。
-value。可选项。任意一种JScript基本数据类型。(Number、Boolean、或String。)如果value为一个对象,返回不作改动的该对象。如果value为null、undefined,或者没有给出,则产生没有内容的对象。
说明:Object对象被包含在所有其它JScript对象中;在所有其它对象中它的方法和属性都是可用的。在用户定义的对象中可以重定义这些方法,并在适当的时候通过JScript调用。toString方法是经常被重定义的Object方法的例子。
-------------------
arguments属性:为当前执行的function对象返回一个arguments对象。
function.arguments
function参数是当前执行函数的名称,可以省略。
说明:通过arguments属性,函数可以处理可变数量的参数。arguments对象的length属性包含了传递给函数的参数的数目。对于arguments对象所包含的单个参数,其访问方法与数组中所包含的参数的访问方法相同。
示例:下面的例子说明了arguments属性的用法:
functionArgTest(){
vari,s,numargs=arguments.length;
s=numargs;
if(numargs<2)
s+="argumentwaspassedtoArgTest.Itwas";
else
s+="argumentswerepassedtoArgTest.Theywere";
for(i=0;i<numargs;i++){
s+=arguments[i]+"";
}
return(s);
}
-------------------
callee属性:返回正被执行的Function对象,也就是所指定的Function对象的正文。
[function.]arguments.callee
可选项function参数是当前正在执行的Function对象的名称。
说明:callee属性是arguments对象的一个成员,仅当相关函数正在执行时才可用。
callee属性的初始值就是正被执行的Function对象。这允许匿名的递归函数。
示例:
functionfactorial(n){
if(n<=0)
return1;
else
returnn*arguments.callee(n-1)
}
print(factorial(3));
要求:版本5.5或以上。
-------------------
caller属性:返回一个对函数的引用,该函数调用了当前函数。
functionName.caller
functionName对象是所执行函数的名称。
说明:对于函数来说,caller属性只有在函数执行时才有定义。如果函数是由JScript程序的顶层调用的,那么caller包含的就是null。
如果在字符串上下文中使用caller属性,那么结果和functionName.toString一样,也就是说,显示的是函数的反编译文本。
下面的例子说明了caller属性的用法:
functionCallLevel(){
if(CallLevel.caller==null)
return("CallLevelwascalledfromthetoplevel.");
else
return("CallLevelwascalledbyanotherfunction.");
}
-------------------
constructor属性:表示创建对象的函数。
object.constructor
必需的object是对象或函数的名称。
说明:constructor属性是所有具有prototype的对象的成员。它们包括除Global和Math对象以外的所有JScript固有对象。constructor属性保存了对构造特定对象实例的函数的引用。
例如:
x=newString("Hi");
if(x.constructor==String)//进行处理(条件为真)。
或
functionMyFunc{
//函数体。
}
y=newMyFunc;
if(y.constructor==MyFunc)//进行处理(条件为真)。
-------------------
description属性:返回或设置与特定错误相联系的描述字符串。
object.description[=stringExpression]
description属性的语法组成部分如下:
参数:-object。必选项。Error对象的任意实例。
-stringExpression。可选项。包含错误描述的字符串表达式。
说明:description属性包含与特定错误相联系的错误信息字符串。使用包含在这个中的值,来警告用户发生了一个不能或不想处理的错误。
-------------------
prototype属性:返回对象类型原型的引用。
objectName.prototype
objectName参数是对象的名称。
说明:用prototype属性提供对象的类的一组基本功能。对象的新实例“继承”赋予该对象原型的操作。
例如,要为Array对象添加返回数组中最大元素值的方法。要完成这一点,声明该函数,将它加入Array.prototype,并使用它。
functionarray_max(){
vari,max=this[0];
for(i=1;i<this.length;i++){
if(max<this[i])
max=this[i];
}
returnmax;
}
Array.prototype.max=array_max;
varx=newArray(1,2,3,4,5,6);
vary=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方法的用法:
functionConcatArrayDemo(){
vara,b,c,d;
a=newArray(1,2,3);
b="JScript";
c=newArray(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("varmydate=newDate();");
传递给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(variablein[object|array])
statements
参数:-variable。必选项。一个变量,它可以是object的任一属性或array的任一元素。
-object,array。可选项。要在其上遍历的对象或数组。
-statement。可选项。相对于object的每个属性或array的每个元素,都要被执行的一个或多个语句。可以是复合语句。
说明:在循环的每次迭代前,variable被赋予object的下一个属性或array的下一个元素。然后可以在循环内的任一语句中使用它,就好像正在使用object的该属性或array的该元素一样。
当在一个对象上迭代时,没有办法决定或控制把对象的成员赋给variable的次序。在数组内将按元素的次序执行迭代,也就是,0、1、2、......
示例:下面示例说明了for...in语句的用法,它把一个对象用作一个联合数组:
functionForInDemo(){
vara,key,s="";//创建某些变量
a={"a":"Athens","b":"Belgrade","c":"Cairo"}//初始化对象
for(keyina){//迭代属性
s+=a[key]+"<BR/>";
}
return(s);
}
-------------------
join方法:返回字符串值,其中包含了连接到一起的数组的所有元素,元素由指定的分隔符分隔开来。
arrayObj.join(separator)
参数:-arrayObj。必选项。Array对象。
-separator。必选项。是一个String对象,作为最终的String对象中对数组元素之间的分隔符。如果省略了这个参数,那么数组元素之间就用一个逗号来分隔。
说明:如果数组中有元素没有定义或者为null,将其作为空字符串处理。
示例:下面这个例子说明了join方法的用法。
functionJoinDemo(){
vara,b;
a=newArray(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方法的用法:
functionReverseDemo(){
vara,l;//声明变量。
a=newArray(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或以上。
分享到:
相关推荐
JavaScript提供了一种灵活的方式来操作类型和对象,这对于理解语言的高级特性如继承、封装和多态至关重要。通过利用.prototype以及new关键字,JavaScript开发者可以创建复杂的对象系统,这是构建现代化Web应用不可或...
JavaScript,作为全球最广泛使用的脚本语言之一,是...通过阅读《JavaScript高级编程》这本书,开发者不仅可以巩固基础,还能掌握高级特性和最佳实践,从而在实际项目中更好地运用JavaScript,提升开发效率和代码质量。
在对象属性和方法的章节,会涉及访问器属性和数据属性的区别,以及如何通过`Object.getOwnPropertyDescriptor()`和`Object.defineProperty()`来管理和修改属性。此外,还会讲解`this`关键字的工作原理及其在不同上下...
2. **对象创建与原型Prototype**: JavaScript使用`new`关键字创建对象实例,原型链允许对象间共享属性和方法,`__proto__`或`prototype`属性是理解这一机制的关键。 3. **函数对象Function**: 在JavaScript中,函数...
在JavaScript面向对象的程序设计中,使用new运算符从构造函数生成实例对象时,每个实例都会有自己的属性和方法副本,这虽然实现了封装,但也导致了内存的浪费,因为无法共享属性和方法。通过引入prototype属性,可以...
当使用new关键字调用构造函数时,JavaScript引擎会创建一个新的空对象,并且按照构造函数中定义的属性和方法来初始化这个新对象。 3. prototype:在JavaScript中,每个函数都有一个prototype属性,这个属性指向一个...
对象是JavaScript的核心特性,包含属性和方法。常见的内置对象如全局对象、Math对象、Date对象、String对象等,每个对象都有其特定的功能。例如,Math对象提供了一系列数学函数,Date对象用于处理日期和时间,String...
本文将深入探讨JavaScript中的面向对象程序设计的高级特性,包括对象的创建、访问、删除,以及`this`关键字的使用,还有内建对象、Object和Array对象。 1. **创建对象** - **构造法**:通过`new Object()`创建一个...
以上只是JavaScript高级特性和设计模式的一小部分。深入理解和熟练应用这些概念,将有助于你编写更高效、可维护的代码,提升软件开发的水平。在学习过程中,通过实践项目和不断研究,你可以更好地掌握JavaScript的...
本文将深入探讨JavaScript的基础、中级和高级概念,特别是其面向对象特性。 一、JavaScript基础 1. 变量与数据类型:JavaScript支持动态类型,允许声明变量时无需指定类型。基本数据类型包括字符串(String)、数字...
关于“工具”这个标签,可能意味着博客中讨论了一些实用的库或工具,比如`lodash`或`jQuery`,这些库提供了便利的方法来操作和获取对象属性。例如,`_.get()`方法在`lodash`中可以安全地获取嵌套对象的属性,即使...
通过原型链,子对象可以访问父对象的所有属性和方法,实现代码复用。 3. **函数表达式与函数声明**:JavaScript允许两种定义函数的方式,函数表达式(如`var func = function() {}`)和函数声明(如`function func...
通过本文的学习,我们不仅了解了JavaScript中动态创建对象属性的基本方法,还深入了解了`Object.defineProperty()` 的高级用法。这些技能对于任何希望提高JavaScript编程水平的开发者来说都是必不可少的。希望本文能...
这意味着在JavaScript中,对象被视为存储数据的一种大型数组形式,其中每个对象都有一个属性列表,包含该对象的所有属性(attributes)和方法(methods)。简而言之,可以将JavaScript对象视为一个包含键值对的容器...
对象是键值对的集合,而原型则允许对象间共享属性和方法,实现面向对象编程。深入理解原型链有助于解决继承和方法调用的问题。此外,闭包是JavaScript中的一个高级概念,它允许函数访问并操作其外部作用域的变量,是...
虽然不能直接调用Global对象,但在Web浏览器中,这些全局属性和方法通过window对象得以实现。 URI编码方法是JavaScript处理URL的重要工具。`encodeURI()`和`encodeURIComponent()`分别用于编码URI和更严格的URI组件...
2. **对象和原型**:JavaScript的面向对象特性通过原型链实现,书中深入探讨了对象的创建、属性访问、原型和继承机制,以及如何利用这些机制来构造复杂的数据结构和模块化代码。 3. **函数式编程**:介绍了...
最基础的方法是使用`new Object()`创建一个新的空对象实例,然后通过点号或方括号运算符添加属性和方法。例如: ```javascript var person = new Object(); person.name = "Nicholas"; person.age = 29; person.job...