Javascript 我能';t解释以下输出的结果
我试图阅读jQuery的源代码,但一些基本概念阻止了我。 为了简单起见,我编写了以下代码,但是输出结果很奇怪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
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