我正在尝试阅读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 ???
答案 0 :(得分:1)
前两个是false
,因为您正在将函数的方法与对象的方法进行比较。
这本身不是问题,但函数会覆盖toString
。基本上,您要比较Function.prototype.toString
和Object.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.toString
与Foo.toString
的引用不同。它与Foo.prototype.toString
相同(检查foo.toString === Foo.prototype.toString
,这是真的)。foo
和foo2
是两个不同的对象。这就是他们的方法不一样的原因。举例说明:
Foo.toString === Function.prototype.toString // true
foo.toString === Foo.prototype.toString