3

我正在尝试阅读 jQuery 的源代码,但一些基本概念阻止了我。为简单起见,我编写了以下代码,但输出结果很奇怪。

function Foo(){
}
var foo = new Foo();
var foo2 = new Foo();

console.log(Foo.toString == Foo.prototype.toString); // false
console.log(foo.toString === Foo.toString); // false
console.log(foo.toString == foo2.toString); // true

我不知道为什么第一个和第二个是假的。我知道任何自定义对象都必须继承 Object,而且我根本没有重写 toString 方法,但是为什么 foo.toString !== Foo.toString !== Foo.prototype.toString ???

4

2 回答 2

1

前两个是false因为您将函数的方法与对象的方法进行比较。
这本身不是问题,但是函数会覆盖toString。所以本质上,你是在比较Function.prototype.toStringObject.prototype.toString,它们是不同的函数。

console.log(Foo.toString == Foo.prototype.toString);

与 相同Function.prototype.toString == Object.prototype.toString,因为Foo是函数并继承自Function.prototype,但是Foo.prototype对象,继承自Object.prototype

console.log(foo.toString === Foo.toString);

同样在这里。foo是一个对象,继承自Foo.prototype,它是一个对象。


这些输出true

console.log(Foo.toString == Function.prototype.toString); // true
console.log(foo.toString === Object.prototype.toString); // true
console.log(foo.toString === Foo.prototype.toString); // true

最后一个是true因为foo是通过构造函数创建的Foo,因此继承自Foo的原型,Foo.prototype

于 2012-05-29T09:36:45.417 回答
0

您不是在比较方法的输出,而是在比较引用。在 javascript 中,相等运算符比较引用,除了原始值(保持简单)。

代码示例:

var foo = 5, bar = 5;
foo === bar // true

var foo = function() {}, bar = function() {};
foo === bar // false

// If you were to compare the outputs, the following would be true:
foo() === bar() // true

回到你的例子:

  • Foo.toString与的引用不同,Foo.prototype.toString与 的引用相同Function.prototype.toString
  • foo.toString与 的引用不同Foo.toString。与Foo.prototype.toString(检查foo.toString === Foo.prototype.toString,是真的)相同。
  • foofoo2是两个不同的对象。这就是为什么他们的方法不一样的参考。

一些例子来说明:

Foo.toString === Function.prototype.toString // true
foo.toString === Foo.prototype.toString
于 2012-05-29T09:38:52.810 回答