Javascript:使用原型函数的问题

时间:2014-11-29 03:05:51

标签: javascript prototype

function test() {
 this.list = {};
 document.getElementById("test").innerHTML = "";
 this.list['test1']= new mutation("test1", 2, {"damage":{"freq":2, "size":"d6"}});
 this.list['test2']= new mutation("test2", 1, {"range":"long"});
 this.list['test1'].level=5;
 alert("test running");
 this.addOptions();
}
test.prototype.addOptions = function(){
 alert("addOptions Running");
 var node = document.getElementById("select");
 var strName;
 for(strName in this.list) {
  var optionNode = document.createElement('option');
  var textnode = document.createTextNode(this.list[strName].name);
  optionNode.appendChild(textnode);
  node.appendChild(optionNode);
  document.getElementById("test").appendChild(this.list[strName].display());
 }
}

我现在一直撞在墙上大约一个小时,但无济于事。

我在另一个文件中做了这个确切的事情,它不仅起作用而且仍在工作,但实际上是由来自mutation()定义的这个文件调用的。

我在Uncaught "TypeError: undefined is not a function"行上收到错误this.addOptions()。在将其重构为新文件并开始尝试将原型应用于下一步之前,所有代码都正常工作,这将基于“选择”框中的列表进行显示更新。再次,巨大的工作正在进行中,但这正在有效地停止进展。

编辑:此代码工作正常

function mutation(nam, freq, opts) {
 this.opts=opts;
 this.name=nam;
 this.nameText = document.createTextNode(nam+": ");
 this.frequency=freq;
 this.level=0;
 this.upd();
}

mutation.prototype.display = function(){
 this.upd();
 var node=document.createElement('span');
 var ret = document.createElement('br');
 node.appendChild(this.nameText);
 node.appendChild(this.damage);
 node.appendChild(this.range);
 node.appendChild(ret);
 return node;
};

mutation.prototype.upd = function(){
 if(this.opts['damage'] || this.opts['Damage']) {
  var dmg = calcDamage(this.level, this.opts['damage']['freq'], this.opts['damage']['size']);
  this.damage = document.createTextNode(dmg+" ");
 } else {
  this.damage = document.createTextNode("");
 }
 if(this.opts['range'] || this.opts['Range']) {
  var rng=rangeFunction(this.level,this.opts['range']);
  this.range = document.createTextNode(rng+"ft. ");
 } else {
  this.range = document.createTextNode("");
 }
};

2 个答案:

答案 0 :(得分:0)

似乎你在它的实际定义之前调用了test()构造函数,并且它的定义得到了提升",即移到了代码的顶部。所以构造函数(test())工作正常,但原型方法仍未定义。但是,分配给原型的第二部分仍然没有在那个角度定义。请检查您的代码订单。

另一个有错误的例子:

a = new A(); // created OK
a.foo(); // error: foo is not a function
A = function() {};
A.prototype.foo = function() { return 'bar'; }

这个有效:

A = function() {};
A.prototype.foo = function() { return 'bar'; }
a = new A(); // created OK
a.foo(); // returns 'bar'

答案 1 :(得分:0)

如果您调用“test()”而不是“new test()”,则会收到您描述的错误。如果您忘记了“new”,那么“this”将不会扩展test.prototype,然后this.addOptions()将不存在。使用'new'调用会创建一个'this',它会扩展原型并引用addOptions。