我无法解释以下输出的结果

时间:2012-05-29 09:33:31

标签: javascript oop

我正在尝试阅读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 ???

2 个答案:

答案 0 :(得分: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的对象。 / p>

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。< / p>

答案 1 :(得分: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.toStringFoo.toString的引用不同。它与Foo.prototype.toString相同(检查foo.toString === Foo.prototype.toString,这是真的)。​​
  • foofoo2是两个不同的对象。这就是他们的方法不一样的原因。

举例说明:

Foo.toString === Function.prototype.toString // true
foo.toString === Foo.prototype.toString