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

标签 javascript

如果我定义一个函数:

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

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

console.log(foo.toString())

输出:

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

如果我然后运行

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

输出:

"[object Function]"

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

最佳答案

What is the difference between these two forms of invocation?

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

i.e. the foo function inherited the toString method from the top level Object and using Object.prototype.toString.call(foo) was just calling toString passing the foo function as the this.

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

你可以这样看:

console.log(foo.toString === Object.prototype.toString); // false

foo 也完全有可能拥有自己的 toString,覆盖它从 Function.prototype 继承的那个,但默认情况下它没有。

所以只改变调用的形式,我们会得到这些,它们是等价的:

console.log(foo.toString());

console.log(foo.toString.call(foo));

或者如果我们知道 foo 不会覆盖 Function.prototype 的版本,那么:

console.log(Function.prototype.toString.call(foo));

关于javascript - foo.toString() 和 Object.prototype.toString.call(foo) 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39328564/

相关文章:

javascript - Node.js 多次打印到控制台,无需换行

javascript - 无法删除事件监听器

javascript - JS id 区分大小写表现出来

javascript - 如何从服务器保留空值? (Groovy 和 JavaScript)

javascript - 使用 jquery 添加和删除输入字段

javascript - Angular [innerHtml] : how to render additional elements inside an element with [innerHtml] directive

Javascript 将 YUV 转换为 RGB

javascript - 有没有一种方法可以让鼠标悬停在上面,这样就不会那么烦躁了?

Django 网站中的 Javascript 和 CSS 混淆/最小化?

javascript - 检查倒计时是否结束