Мое определение прототипа ниже
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]
3 ответа
Причина, по которой вы получаете сообщение об ошибке:
temp.addDup не является функцией
На самом деле интересная функциональность, которая происходит, когда вы пытаетесь получить доступ к неопределенному / недействительному элементу внутри массива. Когда вы пытаетесь получить доступ к:
freqTab["reduce"]
Он будет фактически читать его как фактическую нативную функцию reduce()
. То же самое происходит с другими функциями, такими как freqTab["sort"]
. Затем говорится, что addDup
не является методом reduce
.
Обратите внимание, что в вашем коде массив пуст, и поскольку вы обращаетесь к элементу по строке, вы, скорее всего, захотите использовать объект:
var freqTab = { 'reduce': ... };
В частности, вы можете искать:
var freqTab = { 'reduce': new FreqTab(strMsg,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);
}
Как я объяснил в моем комментарии, проблема в этом состоянии
Комментарий: Если
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")
}
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.