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

RT,

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

问一下为什么结果不一样

阅读 2.5k
3 个回答

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

简单点说它们不是同一个 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 这是原型链的问题了。

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

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