2013-10-30 58 views
0

我限定一個非常簡單的對象,它應該計算數1的總和& 2:當我運行「總和」的方法,所述控制檯返回視爲字符串對象方法

function Calculator() { 
    this.number1 = 0; 
    this.number2 = 0; 
    this.sum = function() { 
     return this.number1 + this.number2; 
    } 
} 

var calculator = new Calculator(); 
calculator.number1 = 1; 
calculator.number2 = 2; 

console.log(calculator.sum); 

然而:

function() { 
     return this.number1 + this.number2; 
    } 

這就像我的方法被認爲是一個字符串,但我不明白爲什麼...

回答

6

你忘了調用它。使用方法:

console.log(calculator.sum()); 

您的方法不被視爲字符串。 calculator.sum是一個包含函數的變量。記錄它而不調用將返回其正文。

+0

非常感謝!花這麼多時間在這麼愚蠢的事情上...... – JeremyW

1

首先,是「被認爲是」爲一個字符串:sum被視爲功能。但是,因爲您試圖「轉儲」函數引用,並且只能轉儲文本,JavaScript需要詢問該對象的字符串表示形式。該對象的字符串表示形式是該函數的源代碼。所以基本上有:

console.log(calculator.sum); 

這是相同的有:

console.log(calculator.sum.toString()); 

這是因爲log需要一個字符串轉儲,並嘗試將參數轉換的東西可以顯示。還要注意,這種行爲取決於您使用的控制檯。例如,Firefox的Web控制檯返回[object Function](因爲它使用Object.prototype.toString而不是函數的),其中Chrome Web控制檯返回函數的toString方法。

你的情況,你想可能調用的方法,因此,你忘了括號:

console.log(calculator.sum()); 

然而,究其原因是因爲你沒有得到任何錯誤,當您嘗試登錄該calculator.sum沒有括號,這是因爲JavaScript有first-class function。這是一個非常強大的東西,它賦予你將函數作爲其他函數的參數傳遞的能力,就像你做的那樣。因此,例如,你可以有:

function log(thing) { 
    console.log(Object.prototype.toString.call(thing)); 
} 

log(1); 
log("something"); 
log(function foo() {}); 

當然,你也可以調用作爲參數傳遞的功能:

function say(something) { 
    alert(something()); 
} 

function hello() { return "Hello!" }; 
function bye() { return "Bye!" }; 

say(hello); 
say(bye); 

這些只是愚蠢的例子,但只給你一個想法。