2015-12-17 96 views
-1

我的原型定義的問題是低於JavaScript的原型,在調用函數

var DupPlayer = function(strName){ 
    this.name = strName; 
} 

var FreqTab = function(strMsg,strName){ 
    this.value =strMsg; 
    this.original = strName; 
    this.dupPlayers = new Array(); 

    FreqTab.prototype.addDup = function(dup){ 
    this.dupPlayers.push(dup); 
    } 
} 

我創建用繩子關鍵數組對象。

var freqTab = new Array(); 
if(freqTab[key]==undefined){ 
    freqTab[key] = new FreqTab(strMsg,strName); 
}else{    
    var temp = freqTab[key]; 
    temp.addDup(new DupPlayer(strName));    
} 

獲取錯誤「TypeError:temp.addDup不是函數」。

請幫我,我在函數調用錯誤的地方。

[編輯] 發現,當關鍵是 '減少' 本次發行occures。 :(

的console.log(freqTab [鍵]),給出以下的輸出,僅當密鑰是減少,對象被存儲爲功能。

{ value: 'sleeping', original: 'Pug', dupPlayers: [] } 
{ value: 'black', original: 'Sur', dupPlayers: [] } 
[Function: reduce] 
+0

如果'freqTab [key]'是未定義的,則將其定義爲新對象。但如果不是那麼它只是一個簡單的數組元素而不是你的對象。因此'addDup'不可用。 – Rajesh

+0

'key'的價值是什麼?與'strMsg'和'strName'一起。介意創建一個片段或小提琴,以便我們可以看到錯誤信息? –

+0

那麼,爲什麼你要使用字符串值的鍵時使用數組?更改爲'freqTab = {};'。 –

回答

2

爲什麼你所得到的錯誤的原因:

temp.addDup is not a function

實際上是一個有趣的功能,當您試圖訪問數組內的未定義/無效項出現這種情況。當您嘗試訪問時:

freqTab["reduce"] 

它實際上會將其作爲實際本地reduce()函數讀取它。其他功能也會發生同樣的情況,如freqTab["sort"]。然後它指出addDup不是reduce的一種方法。

注意,在你的代碼中的數組是空的,因爲你是一個字符串訪問一個項目,你可能更願意使用對象:

var freqTab = { 'reduce': ... }; 

具體來說,你可能會尋找:

var freqTab = { 'reduce': new FreqTab(strMsg,strName) }; 
+0

@spencer,好奇的問題,當我嘗試'功能測試(){}; var arr = []; console.log(arr [「test」]);'這個返回'undefined',而不是函數。那麼它僅限於屬於「對象」或任何其他父範圍的功能? – Rajesh

+0

@Rajesh看來,這隻發生在原生JavaScript函數中。所以,即使你已經做了一個'test()'函數,對於'arr [「test」]',它仍然是'undefined'。 –

0

嘗試使用原型定義之外這樣

var FreqTab = function(strMsg,strName){ 
    this.value =strMsg; 
    this.original = strName; 
    this.dupPlayers = new Array(); 
} 

FreqTab.prototype.addDup = function(dup){ 
    this.dupPlayers.push(dup); 
} 
+0

是的,他應該把原型方法放在構造函數之外,但是這怎麼解釋他所得到的錯誤信息呢?當調用構造函數時,FreqTab.prototype.addDup仍應該被賦值。 –

+0

我不認爲你可以在構造函數內部創建一個原型。如果是這樣,addDup函數永遠不會創建 –

+0

嗯,你當然不應該,但你可以,所以他的問題在別處。 –

0

正如我在我的評論已經解釋了,問題是,在這種情況下

Comment: If freqTab[key] is undefined, you are defining it as new object. But if not then its just a simple element of array and not your object. Hence addDup is not available.

var freqTab = new Array(); 
if (freqTab[key] == undefined) { 
    freqTab[key] = new FreqTab(strMsg, strName); 
} else { 
    var temp = freqTab[key]; 
    temp.addDup(new DupPlayer(strName)); 
} 

相反試試這個:

var freqTab = new Array(); 
if (freqTab[key] == undefined) { 
    freqTab[key] = new FreqTab(strMsg, strName); 
} 

if(freqTab[key] instanceof FreqTab){ 
    var temp = freqTab[key]; 
    temp.addDup(new DupPlayer(strName)); 
} 
else{ 
    console.log("Not an object") 
} 
+0

這樣可以避免這個錯誤,但是爲什麼當這個鍵是'reduce'的時候,這個對象被改變了。我只是打印了freqTab [key],並得到了這些 {value:'sleeping',original:'Pug',dupPlayers:[]} {value:'black',original:'Sur',dupPlayers:[]} [功能:減少] – user3532863

相關問題