如果我定义一个函数:
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
这两种形式的调用有什么区别?
答案 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>]
。更专业的子类型(如Function
或Array
)会覆盖该行为,并将字符串格式化为更适合其类型的字符串。
答案 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的父级