JS中既然每个对象都有toString方法,那么Object.prototype.toString.call()存在的意义是什么

RT,

let a=new Date()
a.toString()     结果是一个具体的时间
Object.prototype.toString.call(a)     "[object Date]"

问一下为什么结果不一样

阅读 154
评论
    3 个回答
    • 6.4k

    简单点说它们不是同一个 toString,这是原型链的问题了。

    将上述代码转化成这样,你就会更明白了:

    class MockDate { toString() { return 'from mock data'; } }
    class MockObject { toString() { return 'from mock object'; } }
    
    let a = new MockDate();
    a.toString(); // output: from mock data
    MockObject.prototype.toString.call(a); // output: from mock object

    至于说意义嘛,你可以看成两个不同对象的 toString 方法名相同而已,虽然他们可能会是指向同一个 toString 这是原型链的问题了。

      • 230

      主要用来判断变量类型, call只是改变调用方法的宿主
      原因在于Object对象是一切对象的祖宗,借用它的toString方法,可呈现子类型的真实根类型在老祖面前的字符串表现形式,即展露原型

        • 4
        • 新人请关照

        Object的原型是所有对象的原型
        你可以理解为,其它对象是复制的一份,然后可以自己修改
        因为Object的原型有toString方法,所以复制出来的所有对象才都有toString方法
        你不能因为复制出来的有了,就删掉原件的方法吧
        不一样就是自己修改过了
        你自己定义的对象也可以修改toString方法啊

          撰写回答

          登录后参与交流、获取后续更新提醒