Object.prototype.toString.call判断数据类型

为什么使用Object.prototype.toString.call来判断没有问题,但是使用Object.toString.call判断就会报错呢?

按照原型链的原理,当前对象上找不到该方法,不就会自动去原型链上找这个方法吗?写成Object.toString找不到不就会自动向Object.prototype.toString上面找吗?
图片描述

阅读 2.7k
4 个回答

主要 Function.prototype 重写 toString 方法, 也就是说它有自己 toString() 方法.

先来理解这两句:

    Object instanceof Function   // true
    
    Object.__proto__ === Function.prototype // true
    

再回来看看你的问题, 从上面的结果来看 Object.toString 是不是指向是 Function.prototype.toString

   Object.toString === Function.prototype.toString   // true

结果正确对, 上面你描述的错误的关键是 Function.prototype 重写 toString()

    funciton aa () {

    }
    aa.__proto__ === Function.prototype // true
    aa.toString() // "function aa(){}"   返回函数字符串形式

也可以这么测试,验证是否被重写

    Function.prototype.toString === Object.prototype.toString // false
    Function.prototype.__proto__ === Object.prototype  // true
    Function.prototype.__proto__.toString.call({})  // "[object Object]"
function A() {
}

A.prototype = {
    b: function() {
        console.log(1)
    }
}

console.log(A.b) // undefined
A.prototype.b() // 1

const a = new A();
a.b() // 1

不知道这个例子恰不恰当, 我感觉是只有实例才会自动去原型链查找

看报错信息是Object.toString.call()接受的参数需要是一个函数以便获取到this。
如果是这样的那就不会报错:

clipboard.png

那么Object.prototype.toString.call运行是什么结果?

clipboard.png

所以我有理由怀疑报错的根源不是找不到toString方法,而是Object.toString方法对于入参类型有要求,同时我猜测Object.toString和Object.prototype.toString可能实现上存在差异。

更深入的部分因为自身水平有限,暂时没法解释。

Object 本身是一个 constructor , javacript 里 contructor 是一个 function object 。

另外注意原型链里基类属性是 __proto__ ,而不是 prototypeprototype 是 constructor 的一个属性,用于赋值给被创建出对象的 __proto__ 。也就是说,用 new Object 创建出的新对象的 __proto__ 属性会是 Object.prototype

由于 Object 是一个 function object ,Object.__proto__ === Function

Object 没有自己的 toString(),所以 Object.toString() 使用 Object.__proto__.toString() (注意,不是 Object.prototype.toString()),也就是 Function.toString()

所以会有 Object.toString()Object.prototype.toString() 的不同。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题