JavaScript中的所有对象都继承自Object类。尽管更加具体分类的对象比如Date和RegExp,都定义了它们自己的属性和方法。但是所有创建的对象也支持Object所定义的属性和方法,由于这些属性和方法的通用性,它们也特别有趣。
① constructor属性
在JavaScript中每个对象都有一个constructor属性,它引用了初始化这个对象的构造函数。例如:
var d=new Date();
d.constructor==Date; //true
既然构造函数定义了新的一种或一类的对象,constructor属性有助于确定一个对象的类型。例如:
if((typeof o=="object") && (o.constructor==Date))
//Then do something with the Date object...
② toString( )方法
toString( )返回一个某种程度上代表着对象的值的一个字符串,而它正是在这个对象上调用的。当JavaScript需要把一个对象转换为一个字符串的时候,它就会调用这个方法。遗憾的是默认的toString( )方法并不能提供多少信息。例如下面的这行代码只是得到字符串"[object Object]":
var s={x:1,y:1}.toString();
由于这个默认的方法并不能显示太多有用的信息,很多类都定义了自己的toString( )。例如当一个数组转换为字符串,会得到数组元素的一个列表,它们中的每一个都转换为一个字符串;而当一个函数转换为字符串的时候,得到的是这个函数的源代码。
③ toLocaleString( )方法
在ECMAScript v3和JavaScript 1.5中,Object类除了它自己的toString( )方法之外还定义了toLocaleString( )方法。这个方法的作用是返回对象的一个本地化字符串表示。Object所定义的默认的toLocaleString( )方法并不会本地化自己,它总是返回和toString( )完全相同的内容。然而子类可以定义它们自己的toLocaleString( )版本。
④ valueOf( )方法
当JavaScript需要把一个对象转换为某种基本数据类型,也就是一个数字而不是一个字符串的时候,就调用valueOf( )方法。如果一个对象用在需要一个基本数值的环境中,JavaScript会自动调用这个方法。默认的valueOf( )方法并不做什么有意义的事情,一些内建的对象就定义了它们自己的valueOf( )方法。在学习完类,构造函数和原型之后,我们就可以自己定义一个定制对象的valueOf( )方法。
⑤ hasOwnProperty( )方法
如果对象用一个单独的字符串参数所指定的名字来本地定义一个非继承的属性,hasOwnProperty( )方法就返回true,否则返回false。例如:
var o={};
o.hasOwnProperty("undef"); //false
o.hasOwnProperty("toString"); //false
Math.hasOwnProperty("cos"); //true
⑥ propertyIsEnumerable( )方法
如果对象用一个单独的字符串参数所指定的名字来定义一个非继承的属性,并且如果这个属性可以在for/in循环中枚举,propertyIsEnumerable( )方法就返回true,否则返回false。例如:
var o={x:1};
o.propertyIsEnumerable("x"); //true
o.propertyIsEnumerable("y"); //false
o.propertyIsEnumerable("valueOf"); //false
注意一个对象的所有的用户定义属性都是可以枚举的。不能枚举的属性通常都是继承的属性。
⑦ isPrototypeOf( )方法
如果isPrototypeOf( )方法所属的对象是参数的原型对象,那么该方法就返回true,否则返回false。
var o={};
Object.prototype.isPrototypeOf(o); //true
Object.isPrototypeOf(o); //false
o.isPrototypeOf(Object.prototype); //false
Function.prototype.isPrototypeOf(Object); //true