2012-05-29 21 views
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 ???

+0

不是一個JavaScript專家,但我相信'.toString'是一個功能,應該作爲'的ToString()' – slash197

回答

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繼承。

+0

我感到有點困惑。由於Foo是Function的一個實例,並且我沒有重寫toString方法,所以當我引用Foo.toString時,它應該搜索原型鏈。因此搜索Foo.prototype。在這種情況下,Foo.toString應該等於Foo.prototype.toString,不是嗎? – ForbetterCoder

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