为什么在方法上调用(call)和在obj上调用方法之间存在差异

时间:2014-07-02 11:25:42

标签: javascript call

抱歉,我真的应该问为什么会有不同之处,

`Object.prototype.toString.call(o).slice(x,y);`

这个?

o.toString().slice(x.y);

//为什么那些不同,调用应该改变被调用方法的'this'值 //并且toString已经被继承,

var x = 44 ;


`Object.prototype.toString.call(x)`; //"[object Number]"

x.toString(); // '44'

3 个答案:

答案 0 :(得分:1)

您没有在此方法上调用.call

Object.prototype.toString(o).slice(x,y);

相反,您只需使用o作为参数调用方法(在原型对象上)。

获取一个等效的方法来调用

o.toString().slice(x.y);

(调用o对象上的方法,没有参数),你需要使用

o.toString.call(o).slice(x.y);

  

为什么x.toString()Object.prototype.toString.call(x)不同?

由于x = 44是一个数字,当您访问x.toString时,您会获得Number.prototype.toString method而不是Object.prototype.toString method。你也可以写

Number.prototype.toString.call(x)

获取"44"

答案 1 :(得分:0)

使用第二个并检查一个类(您的第一个案例)与该类的实例(第二个案例)之间的区别。

http://en.wikipedia.org/wiki/Instance_(computer_science)

它是一种面向所有语言的通用面向对象编程问题。

  • 首先是类型的一般定义(没有任何具体数据) - 你称之为错误
  • 第二个是具有自己数据的特定实例(可以是多个)

反正: Object.prototype.toString(o)返回" Object对象"所以它不适合你。

答案 2 :(得分:0)

第一个(Object.prototype.toString)调用对象的内置函数或默认的toString函数,第二个函数调用o的toString函数,该函数可能已被覆盖,也可能未被覆盖

var o = {};
o.toString();
    // "[object Object]"
o.toString = function(){};
o.toString();
    // undefined
Object.prototype.toString.call(o);
    // "[object Object]"

使用数字(例如44),toString函数与对象不同。调用值为44的变量的toString函数实际上会Number.prototype.toString.call()。因此产出不同。

几种不同的类型:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toString https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/toString https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toString