Object.prototype.toString.call()

2020-04-14  本文已影响0人  小龙虾Julian

1、toString()方法和Object.prototype.toString.call()方法对比

var arr = [1,2];
//直接对一个数组调用toString()
arr.toString();     // "1,2"
//通过call指定arr数组为Object.prototype对象中的toString方法的上下文
Object.prototype.toString.call(arr);     //"[object Array]"

Object.prototype.toString()本身是允许被修改的,数组的toString()方法实际上是Object.prototype.toString()重写后的方法,并不是Object.prototype中的toString(),Object.prototype.toString()方法使用来判断数据类型的,如:

Object.prototype.toString.call(arr);     //"[object Array]"  判断是否是数组

而重写后的toString()方法可以把数组转换为字符串,如:

[1,2].toString();     // "1,2" 

2、事实上只有Object.prototype上的toString才能用来进行复杂数据类型的判断,而数组的toString()方法是重写了Object.prototype的toString()方法,所以当使用arr.toString()时,不能进行复杂数据类型的判断,因为它调用的是Array.prototype.toString,虽然Array也继承自Object,但此时数组的toString()方法是js在Array.prototype上重写了toString(也就是为我们提供的现成的将数组转换为字符串的方法),而我们通过toString.call(arr)实际上是通过原型链调用了Object.prototype.toString,当然也可以直接使用 arr.toString()直接调用。如:

var arr = [1,2];
console.log(Object.prototype.toString.call(arr));     //[object Array]
console.log(Array.prototype.toString.call(arr));     "1,2"

3、原型链——js中的对象都继承自Object,所以当在某个对象上调用一个方法时,会先在该对象上进行查找,如果没找到则会进入对象的原型(也就是.prototype)进行查找,如果没找到,同样的也会进入对象的原型的原型进行查找,直到找到或者进入原型链的顶端Object.prototype才会停止。

上一篇下一篇

猜你喜欢

热点阅读