JavaScript原型,调用函数时出现问题

JavaScript prototype, issue in calling function

本文关键字:问题 函数 原型 调用 JavaScript      更新时间:2023-09-26

我的原型定义低于

 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不是函数"。

请帮我在函数调用中哪里出错了。

[edit]发现当键为"reduce"时会出现此问题。:(

console.log(freqTab[key])给出以下输出,只有当键被减少时,对象才被存储为函数。

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

出现错误的原因:

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