JavaScript语言中toString()方法的使用详解

作者:admin     字体:[增加 减小]    类型:原创
在JavaScript中toString()方法没有任何实际参数,它返回的是一个字符串,该字符串代表了调用它的对象的类型或值。当JavaScript需要将一个对象转换成字符串时就调用这个对象的toString()方法。例如,当用运算符“+”

在JavaScript中toString()方法没有任何实际参数,它返回的是一个字符串,该字符串代表了调用它的对象的类型或值。当JavaScript需要将一个对象转换成字符串时就调用这个对象的toString()方法。例如,当用运算符“+”把一个字符串和一个对象连接在一起时,比如:

<script>
/*
    圆的构造函数
*/
function Circle(r,x,y){
    this.r = r; //半径
    this.x = x; //x坐标
    this.y = y; //y坐标
}
/*
    求圆的面积
*/
Circle.prototype.area = function() {
    return Math.PI * this.r * this.r;
}

var c = new Circle(1,0,0);
document.write(c);  //[object Object]
document.write("circle:"+c);  //circle:[object Object]
</script>

或者要把一个对象传递给alert()或document.write()方法时,就会调用toString()。

默认的toString()方法提供的信息并不多。例如,在上面的代码中实例化的对象c得到的却是字符串“[object Object]”。

由于默认的方法并不能显示出太多有用信息,所以许多类都定义了自己的toString()方法。例如,当一个数组被转换成一个字符串时,就得到一个数组元素的列表,其中每个元素都被转换成了字符串。比如:

<script>
var a = [1,2,3];
document.write(a); //1,2,3
</script>

当一个函数被转换成字符串时,就会得到该函数的源代码。比如:

<script>
/*
    圆的构造函数
*/
function Circle(r,x,y){
    this.r = r; //半径
    this.x = x; //x坐标
    this.y = y; //y坐标
}
/*
    求圆的面积
*/
Circle.prototype.area = function() {
    return Math.PI * this.r * this.r;
}

var c = new Circle(1,0,0);
document.write(c.area.toString());  //function () { return Math.PI * this.r * this.r; }
</script>

toString()的目的是每个对象类都有自己特定的字符串表示,所以应该定义一个合适的toString()方法将对象转换成相应的字符串形式。当你定义一个类时,就应该为它定义一个toString()方法,以便能将这个类的实例转换成有意义的字符串。这个字符串应该包含被转换的对象的有用信息,因为这对调试来说非常有用。如果仔细选择字符串转换,它在程序中也会非常有用。

下面的代码展示了我们为Circle类定义的toString方法:

Circle.prototype.toString = function() {
    return "[Circle of radius " + this.r + ",centered at {" + this.x + "," + this.y + "}" + "]";
}

用上面的toString()方法可以将一个典型的Circle对象转换成字符串[Circle of radius 1,centered at {0,0}]

由类Object定义的默认toString方法有一个有趣的特性,那就是它揭示了一些有关内置对象的内部类型信息。这个默认的toString()方法返回的字符串形式总是 [object class] class是对象的内部类型,通常对应于该对象的构造函数名。例如,Array对象的class为'Array','Function'对象的class为'Function',Date对象的class为'Date',内部Math对象的class为'Math',所有Error对象(包括各种Error子类的实例)的class为“Error”。客户端JavaScript对象和由JavaScript实例定义的其他所有对象都具有已定义实现的class(如“Window”、“Document”和“Form”)。用户定义的对象的class为“Object”。

注意,class值提供了typeof运算符(对所有对象都返回“Object”或“Function”)不能提供的有用信息。获取这个class值的唯一方法是调用Object定义的默认toString()方法。因为类常常会定义自己的toString()方法,所以不能只是调用某个对象的toString()方法:

document.write(c.toString()); //调用该对象中定制的toString()方法

但是,必须明确地引用Object.prototype对象默认的toString()函数,用函数的apply()方法在想要使用的对象上调用它:

Object.prototype.toString.apply(c);

我们可以使用这种方法定义一个函数,以提供强化了的“type of”功能:

function Typeof(x) {
    var t = typeof x;
    if( 'object'!=t ) {
        return t;
    }
    var o = Object.prototype.toString.apply(x); //返回'[object class]'
    o = o.substring(8,o.length-1);  //把持'[object'和']'
    return o;
}

下面是完整的代码

<script>
/*
    圆的构造函数
*/
function Circle(r,x,y){
    this.r = r; //半径
    this.x = x; //x坐标
    this.y = y; //y坐标
}
/*
    求圆的面积
*/
Circle.prototype.area = function() {
    return Math.PI * this.r * this.r;
}

Circle.prototype.toString = function() {
    return "[Circle of radius " + this.r + ",centered at {" + this.x + "," + this.y + "}" + "]";
}

var c = new Circle(1,0,0);
function Typeof(x) {
    var t = typeof x;
    if( 'object'!=t ) {
        return t;
    }
    var o = Object.prototype.toString.apply(x); //返回'[object class]'
    o = o.substring(8,o.length-1);  //把持'[object'和']'
    return o;
}

document.write(Typeof(c));  //Object
c = new Date;
document.write(Typeof(c));  //Date
</script>

可以看出,对于自定义的类,还是只能获取“Object”