有何区别,为何一定要通过call。

我们知道call是用来改变函数作用域的,Object.prototype.toString.call在这儿也是用来改变作用域的。

Object.prototype.toString()  在toString方法被调用时,会执行下面的操作步骤(参考):

1. 获取this对象的[[Class]]属性的值。

2. 计算出三个字符串"[object ", 第一步的操作结果Result(1), 以及 "]"连接后的新字符串。

3. 返回第二步的操作结果Result(2)。

[[Class]]是一个内部属性,所有的对象(原生对象和宿主对象)都拥有该属性.在规范中,[[Class]]是这么定义的: 内部属性 描述 [[Class]] 一个字符串值,表明了该对象的类型。

其过程简单说来就是:1、获取对象的类名(对象类型)。2、然后将[object、获取的类名、]组合并返回。

读了上面的说明,用call的关键地方就在第1步,获取的是this对象,不加call改变作用域时this指向的是Object.prototype啊!

还有一点,为何一定要用原型链最顶层的Object.prototype,而不是直接用需要获取数据类型对象的呢,因为在原型链上找toString方法时,还没到找到Object的时候,就已经找到了其本身对象的toString方法了,而这个方法改写了Object的了。

最新文章

  1. 导出excel用ajax不行,提交form表单可以
  2. 人人都是 DBA(XV)锁信息收集脚本汇编
  3. 冒泡排序java代码
  4. jQuery入门第二天&&&正则表达式完结篇——仿smarty引擎的制作
  5. JavaScript解析json
  6. RESTful风格的Web服务框架:Swagger
  7. Longest Ordered Subsequence
  8. javascript事件详细说明
  9. jquery easyUI DataGrid 初始化的时候就显示可排序的字段
  10. Play framework 2.0
  11. Spring中Druid链接池的配置
  12. linux系统命令<二>----du的使用方法
  13. Servlet--HttpServletRequest一些不常用的方法
  14. animation & @keyframes 实现loading效果
  15. python的进程与线程(一)
  16. Timeline高级扩展
  17. js中的一些简单问题
  18. Python解释器有哪些?Python解释器种类
  19. Javascript - ExtJs - Itemselector
  20. Linux查看特定端口是否被占用并kill掉相关进程

热门文章

  1. qemu 参数简介
  2. MySql开发之函数
  3. amazeui页面分析4
  4. HttpClient证书回调问题解决
  5. WSL(Windows上的Linux子系统)
  6. C语言深度剖析-----函数与指针分析
  7. [java面试]宇信易诚 广州分公司 java笔试题目回顾录
  8. [MobX] MobX fundamentals: deriving computed values and managing side effects with reactions
  9. ios开发swift学习第三天:逻辑分支
  10. mysql 悲观锁 的运用