Javascript 我能';t解释以下输出的结果

Javascript 我能';t解释以下输出的结果,javascript,oop,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.to

我试图阅读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

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

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

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

这里也一样
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
您不是在比较方法的输出,而是在比较引用。在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

不是javascript专家,但我相信
.toString
是一个函数,应该用作
.toString()
我有点困惑。因为Foo是函数的一个实例,我没有重写toString方法,所以当我引用Foo.toString时,它应该搜索原型链。因此,搜索Foo.prototype。在这种情况下,Foo.toString应该与Foo.prototype.toString相等,不是吗?
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 === Function.prototype.toString // true
foo.toString === Foo.prototype.toString