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