foo.toString()和Object.prototype.toString.call(foo)有什么区别?

时间:2016-09-05 10:24:49

标签: javascript

如果我定义一个函数:

function foo() {
        alert(this.x);
}

我可以通过调用toString函数上的foo方法来打印函数定义。

console.log(foo.toString())

输出:

  

function foo(){               警报(this.x);       }

如果我再运行

console.log(Object.prototype.toString.call(foo))

输出:

  

“[对象功能]”

令我惊讶的是输出不同。我认为这两种形式是等价的?,即foo函数从顶层toString继承了Object方法,而使用Object.prototype.toString.call(foo)只是调用toString传递foo函数为this 这两种形式的调用有什么区别?

4 个答案:

答案 0 :(得分:4)

  

这两种形式的调用有什么区别?

这不仅仅是调用的形式的差异,您还完全调用了不同的函数。

  

即。 foo函数从顶级toString继承了Object方法,使用Object.prototype.toString.call(foo)只是调用toString传递foo函数作为{ {1}}。

一切都很完美,除了第一位。 :-) this不会从foo继承toString,因为Object.prototype是一个函数,foo(继承自Function.prototype })覆盖 Object.prototype以赋予其不同的行为。

你可以这样看:

toString

console.log(foo.toString === Object.prototype.toString); // false 完全有可能拥有自己的foo,覆盖它从toString继承的那个,但默认情况下它不会。< / p>

因此只需更改调用的表单,我们就会得到相同的内容:

Function.prototype

console.log(foo.toString());

或者如果我们知道console.log(foo.toString.call(foo)); 没有覆盖foo的版本,那么:

Function.prototype

答案 1 :(得分:3)

.toString是每种类型的对象覆盖并为其自己的类型进行自定义的方法之一。通用Object.prototype.toString方法通常将所有内容打印为[object <type>]。更专业的子类型(如FunctionArray)会覆盖该行为,并将字符串格式化为更适合其类型的字符串。

答案 2 :(得分:1)

它们不等同,因为你正在调用两个不同的内部函数。

一个是Object.prototype.toString(),另一个是Function.prototype.toString()

Object one始终打印"[object [[Class]]]"(其中[[Class]]是ES概念),其中Function对象已定义为返回其自身的字符串化版本(将在其上显示其toString()Object.prototype)之前的原型。

答案 3 :(得分:0)

尝试调用Function.prototype.toString.call(foo),因为Object是所有内容的父级,但Function当前是foo的父级