Мое определение прототипа ниже

 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));             
 }

Получение ошибки «Ошибка типа: temp.addDup не является функцией».

Пожалуйста, помогите мне, где я ошибся при вызове функции.

< EM> [ править] Обнаружено, что эта проблема возникает, когда ключ уменьшить . :(

Console.log (freqTab [key]) дает вывод ниже, только когда ключ уменьшен, объект сохраняется как функция.

{ value: 'sleeping', original: 'Pug', dupPlayers: [] } 
{ value: 'black', original: 'Sur', dupPlayers: [] } 
[Function: reduce]
-1
user3532863 17 Дек 2015 в 09:21

3 ответа

Лучший ответ

Причина, по которой вы получаете сообщение об ошибке:

temp.addDup не является функцией

На самом деле интересная функциональность, которая происходит, когда вы пытаетесь получить доступ к неопределенному / недействительному элементу внутри массива. Когда вы пытаетесь получить доступ к:

freqTab["reduce"]

Он будет фактически читать его как фактическую нативную функцию reduce(). То же самое происходит с другими функциями, такими как freqTab["sort"]. Затем говорится, что addDup не является методом reduce.

Обратите внимание, что в вашем коде массив пуст, и поскольку вы обращаетесь к элементу по строке, вы, скорее всего, захотите использовать объект:

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

В частности, вы можете искать:

var freqTab = { 'reduce': new FreqTab(strMsg,strName) }; 
2
Spencer Wieczorek 17 Дек 2015 в 06:59

Попробуйте использовать прототип вне определения, как это

 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
Giannis Tzagarakis 17 Дек 2015 в 06:34

Как я объяснил в моем комментарии, проблема в этом состоянии

Комментарий: Если freqTab[key] не определен, вы определяете его как новый объект. Но если нет, то это просто элемент массива, а не ваш объект. Следовательно, addDup недоступен.

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
Rajesh 17 Дек 2015 в 06:47