Object对象超类

本文详细介绍了JavaScript中的Object对象,作为所有JavaScript对象的超类,Object拥有多种方法,如hasOwnProperty()用于检查对象是否包含特定本地属性,isPrototypeOf()判断对象是否是另一对象的原型,propertyIsEnumerable()检测属性是否可枚举,以及toString()和valueOf()用于对象的字符串和原始值转换。此外,还讨论了如何使用这些方法来判断对象类型和自定义对象的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、语法Object含有所有JavaScript对象的特性的超类

构造函数

new Object(  )

new Object(value)

参数value 

可选的参数,声明了要转换成Number对象、Boolean对象或String对象的原始值(即数字、布尔值或字符串)

返回值

如果没有给构造函数传递value参数,那么它将返回一个新创建的Object实例。如果指定了原始的value参数,构造函数将创建并返回原始值的包装对象,即Number对象、Boolean对象或String对象。当不使用new运算符,将Object()构造函数作为函数调用时,它的行为与使用new运算符时一样。

属性constructor 

对一个JavaScript函数的引用,该函数是对象的构造函数。

方法hasOwnProperty( ) 

检查对象是否有局部定义的(非继承的)、具有特定名字的属性。

isPrototypeOf( ) 

检查对象是否是指定对象的原型。

propertyIsEnumerable( ) 

检查指定的属性是否存在,以及是否能用for/in循环枚举。

toLocaleString( ) 

返回对象地方化的字符串表示。该方法的默认实现只调用toString()方法,但子类可以覆盖它,提供本地化。

toString( ) 

返回对象的字符串表示。Object类提供的该方法的实现相当普通,并且没有提供更多有用的信息。Object的子类通过定义自己的toString()方法覆盖了这一方法(toString()方法能够生成更有用的结果)。

valueOf( ) 

返回对象的原始值(如果存在)。对于类型为Object的对象,该方法只返回对象自身。Object的子类(如Number和Boolean)覆盖了该方法,返回的是与对象相关的原始数值。

描述

Object类是JavaScript语言的内部数据类型。它是其他JavaScript对象的超类,因此其他对象都继承了Object类的方法和行为。

除了用上面所示的Object()构造函数,还可以用Object直接量语法创建并初始化对象。

2、语法object.constructor对象的构造函数

描述

对象的constructor属性引用了该对象的构造函数。例如,如果用Array()构造函 数创建一个数组,那么a.constructor引用的就是Array:

a = new Array(1,2,3);   // 创建一个对象

a.constructor == Array  //计算结果为true

onstructor属性常用于判断未知对象的类型。给定了一个未知的值,就可以使用typeof运算符来判断它是原始的值还是对象。如果它是对象,就可以使用constructor属性来判断对象的类型。例如,下面的函数用来判断一个给定的值是否是数组:

function isArray(x) {

    return ((typeof x == "object") && (x.constructor == Array));

}

但是要注意,虽然这种方法适用于JavaScript核心语言的内部对象,但对于“主对象”,如Window这样的客户端JavaScript对象,这种方法就不一定适用了。Object.toString()方法的默认实现提供了另一种判断未知对象类型的方法。

3、语法object.hasOwnProperty{(propname)检查属性是否被继承}

参数propname 

一个字符串,包含object的属性名。

返回值

如果object有propname指定的非继承属性,则返回true。如果object没有名为 propname指定的属性,或者它从原型对象继承了这一属性,则返回false。

描述

JavaScript对象既可以有自己的属性,又可以从原型对象继承属性。 hasOwnProperty()方法提供了区分继承属性和非继承的局部属性的方法。

示例

var o = new Object(  );          // 创建对象

o.x = 3.14;                      // 定义非继承的局部属性y

o.hasOwnProperty("x");           // 返回 true: x 是O的局部属性

o.hasOwnProperty("y");           // 返回 false: o 没有属性y

o.hasOwnProperty("toString");    // 返回 false: toString属性是继承的

4、语法object.isPrototypeOf(一个对象是否是另一个对象的原型)

参数 :任意对象。

返回值

如果object是O的原型,则返回true。如果o不是对象,或者object不是o的原 型,则返回false。

描述

JavaScript对象继承了原型对象的属性。一个对象的原型是通过用于创建并初始化该对象的构造函数的prototype属性引用的。isPrototypeOf()方法提供了判断一个对象是否是另一个对象原型的方法。该方法可以用于确定对象的 类。

示例

var o = new Object(  );                          // 创建一个对象

Object.prototype.isPrototypeOf(o)                // true: o 是一个对象

Function.prototype.isPrototypeOf(o.toString);    // true: toString 是一个函数

Array.prototype.isPrototypeOf([1,2,3]);          // true: [1,2,3] 是一个数组

//下面是执行同样测试的另一种方法

(o.constructor == Object);  // true: o was created with Object(  ) constructor

(o.toString.constructor == Function);  // true: o.toString is a function

/原型则对象本身于原型对象。下面的调用返回true

//说明函数继 Function.prototype和Object.prototyp属性.

Object.prototype.isPrototypeOf(Function.prototype);

5、语法object.propertyIsEnumerable(propname是否可以通过for/in循环看到属性)

参数propname 

一个字符串,包含object原型的名字。

返回值

如果object具有名为propname的非继承属性,而且该属性是可枚举的(即用for/in循环可以枚举出它),则返回true。

描述

用for/in语句可以遍历一个对象“可枚举”的属性。但并非—个对象的所有属性都是可枚举的,通过JavaScript代码添加到对象的属性是可枚举的,而内部对象的预定义属性(如方法)通常是不可枚举的。propertylsEnumerable()方法提供了区分可枚举属性和不可枚举属性的方法。但要注意,ECMAScript标准规定,propertyIsEnumerable()方法不检测原型链,这意味着它只适用于对象的局部属性,不能检测继承属性的可枚举性。

示例

var o = new Object(  );                // 创建一个对象

o.x = 3.14;                            // 定义—个属性

o.propertyIsEnumerable("x");           // true属性x是局部的、可枚举的

o.propertyIsEnumerable("y");           //false:o没有属性y

o.propertyIsEnumerable("toString");    //false:toStrlng属性是继承的

Object.prototype.propertyIsEnumerable("toString");  // false: 枚举的

Bug

当标准限制propertylsEnumerable()方法只能检测非继承属性时,明显是错的。 Internet Explorer 5.5按标准实现了该方法。Nestacpe 6.0实现的propertyIsEnumerable()方法考虑了原型链。虽然这种方法可取,但它与标准冲突,所以Netscape 6.1修改了它,以便与IE 5.5匹配。由于标准中有这个错误,因此该方法不是那么有用。

6、语法object.toString( 返回对象的本地字符串表示)

返回值

表示对象的字符串。

描述

该方法用于返回对象的字符串表示,本地化为适合本地的形式。Object类提供的默认的toLocaleString()方法只调用toString()方法,返回非本地化的字符串。但其他类(包括Array、Date和Number)定义了自己的toLocaleString()版本,指定本地化字符串的转换。在定义自己的类时,也可以覆盖该方法。

7、语法object.toString( 定义一个对象的字符串表示)

返回值

表示对象的字符串。

描述

这里的方法toString()并不是在JavaScript程序中经常显示调用的那个toString()方法。它是在对象中定义的一个方法,当系统需要把对象转换成字符串时就会调用它。

当在字符串环境中使用对象时,JavaScript系统就会调用toString()方法把那个对象转换成字符串。例如,假定—个函数期望得到的参数是字符串,那么把对象传递给它时,系统就会将这个对象转换成字符串:

alert(my_object);

同样,在用运算符“+”连接字符串时,对象也会被转换成字符串:

var msg = 'My object is: ' + my_object;

调用方法toStrlng()时不给它传递任何参数,它返回的应该是一个字符串。要使这个字符串有用,它的值就必须以调用toString()方法的对象的值为基础。

当用JavaScript自定义一个类时,为这个类定义一个toString()方法很有用。如果没有给它定义toString()方法,那么这个对象将继承Object类的默认toString()方法。这个方法返回的字符串形式如下:

[object class]

这里,class是一个对象类,其值可以是“Object”、“String”、“Number”、“Function”、 “Window”、“Document”,等等。这种行为有时对确定未知对象的类型或类有用。但由于大多数对象都有自定义的tostring()版本,所以必须明确地对对象o调用 Object.toString(),代码如下所示:

Object.prototype.toString.apply(o);

注意,这种识别未知对象的方法只适用于内部对象。如果你定义了自己的对象类,那么它的类是“Object”。在这种情况下,可以用Obiect.constructor属性获取更多有关对象的信息。

在调试JavaScript程序时,toString()方法非常有用,使用它可以输出对象,查看它们的值。因此,为你创建的每个对象类都定义toString()方法很有用。

虽然tostring()方法通常由系统自动调用,但你也可以自己调用它。例如,在JavaScript不能自动把对象转换成字符串的环境中,可以明确地调用toString()方法来实现这一点:

y = Math.sqrt(x);       // 计算一个数

ystr = y.toString(  );  // 转换为—个字符串

注意,在这个例子中,数字具有内部的toStrlng()方法,可以用该方法进行强制性的转换。

在其他的环境中,即使JavaScript可以自动地进行转换,你也可以调用toString()方法,因为对toString()的明确调用可以使代码更加清晰:

alert(my_obj.toString(  ));

8、语法object.valueOf(指定对象的原始值 )

返回值

与对象object相关的原始值(如果存在)。如果没有值与object相关,则返回对象自身。

描述

对象的valueOf()方法返回的是与那个对象相关的原始值(如果这样的值存在)。对于类型为Object的对象来说,由于它们没有原始值,因此该方法返回的是这些对象自身。

对于类型为Number的对象,valueOf()返回该对象表示的原始数值。同样,对于Boolean对象来说,该方法返回与对象相关的布尔值。对于String对象来说,返回与 对象相关的字符串。

其实,几乎没有必要自己调用valueOf()方法。在期望使用原始值的地方,JavaScript会自动地执行转换。事实上,由于方法valueOf()是被自动调用的,因此要分辨究 竟是原始值还是与之相应的对象非常困难。虽然使用typeof运算符可以显示字符串和String对象之间的区别,但在实际应用中,它们在JavaScript代码中的作用是一样的。

Number对象、Boolean对象和String对象的valueOf()方法可以将这些包装对象转 换成它们表示的原始值。在调用构造函数Obioct()时,如果把数字、布尔值或字符 串作为参数传递给它,它将执行相反的操作,即将原始值打包成相应的对象。几乎在所有的环境中,JavaScript都可以自动地实现原始值和对象之间的转换,所以一般说 来没有必要用这种方法调用构造函数Object()。

在某些环境中,你可以为自己的对象定制一个valueOf()方法。例如,你可以定义 一个JavaScript对象来表示复数(即一个实数加一个虚数)。作为这个对象的一部分, 要给它定义执行复数的加法、乘法等其他运算的方法。不过,还有一种功能是你想要的,即像处理常规实数一样处理复数,舍弃它的虚数部分。可以使用下面的代码实现 这一点:

Complex.prototype.valueOf = new Function("return this.real");

有了这个为Complex对象定义的valueOf()方法,就可以把复数对象传递给方法 Math.sqrt(),它将计算复数的实数部分的平方根。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值