Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript原型,调用函数时出现问题_Javascript_Node.js - Fatal编程技术网

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

JavaScript原型,调用函数时出现问题,javascript,node.js,Javascript,Node.js,我的原型定义如下 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){

我的原型定义如下

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

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

[编辑] 发现此问题在键为“reduce”时发生:(

log(freqTab[key])给出以下输出,仅当key为reduce时,对象存储为函数

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

尝试像这样在定义之外使用原型

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

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

出现错误的原因如下:

temp.addDup不是一个函数

实际上是一个有趣的功能,当您尝试访问数组中的未定义/无效项时会发生。当您尝试访问:

freqTab["reduce"]
它实际上会将其读取为实际的本机
reduce()
函数。其他函数如
frektab[“sort”]
也会发生同样的情况。然后它声明
addDup
不是
reduce
的方法

请注意,在您的代码中,数组是空的,由于您是通过字符串访问项目,因此您可能更希望使用对象:

var freqTab = { 'reduce': ... };
具体而言,您可能正在寻找:

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

如果
freqTab[键]
是未定义的,您正在将其定义为新对象。但如果不是,则它只是数组的一个简单元素,而不是您的对象。因此,
addDup
不可用。
key
的值是多少?以及
strMsg
strName
。介意创建一个片段或小提琴,以便我们可以看到错误消息吗?好的,为什么u当您想使用字符串值键时使用数组?更改为
freqTab={};
.var freqTab=new array();如果(freqTab[key]==undefined){freqTab[key]=new freqTab(strMsg,strName);}否则{var temp=freqTab[key];temp.addDup(new duplayer(strName));}你在哪里调用上面的代码?是的,他应该把prototype方法放在构造函数之外,但是这如何解释他得到的错误消息呢?
FreqTab.prototype.addDup
在调用构造函数时仍然应该被赋值。我不认为你可以在构造函数内部创建一个原型。如果是这样,那么
addDup
函数永远不是createdWell,你当然不应该,但你可以,所以他的问题就在别处。“我认为你不能在构造函数内部创建原型”为什么不可以?为什么不能分配给
FreqTab.prototype
?大家好,只有当键的值为'reduce'时,我才会遇到这个问题。这将避免错误,但为什么当键为'reduce'时,对象会变为函数。我刚刚打印了FreqTab[key]并得到了这些{value:'sleeping',original:'Pug',dupPlayers:[]}{value:'black',original:'Sur',dupPlayers:[]}[Function:reduce]@spencer,奇怪的问题,当我尝试
Function test(){};var arr=[];console.log(arr[“test”]);
此返回值
未定义
,而不是函数。那么它是否仅限于属于
对象
或任何其他父作用域的函数?@Rajesh这似乎只发生在本机JavaScript函数上。因此,即使您创建了
test()
函数,对于
arr,它仍然是
未定义的
[“测试”]
var freqTab = { 'reduce': new FreqTab(strMsg,strName) };