通过循环定义javascript原型函数

时间:2015-07-13 18:45:58

标签: javascript prototype

我尝试从数组中定义原型函数。如下例所示:我的黑兔应该说'toto',但它没有说出来!为什么?

function Rabbit ( type ) {
    this.type = type ;
}

var funcs = ["says", "doesnt_say"];

for(var i=0;i<funcs.length;i++)
{
    var f = funcs[i];
    Rabbit.prototype[f] = function ( line ) {
        alert(" The " + this.type + " rabbit " 
              + f + "  '" + line + " '") ;
    };
}

var blackRabbit = new Rabbit ("black") ;
blackRabbit.says("toto");

http://jsfiddle.net/xou11bgu/

可见

2 个答案:

答案 0 :(得分:1)

问题是变量“f”由您创建的所有函数共享,并且最终会得到最后一个函数名的值。

您可以使用函数来构造函数:

Rabbit.prototype[f] = function(f) {
    return function ( line ) {
        alert(" The " + this.type + " rabbit " 
              + f + "  '" + line + " '") ;
    };
}(f);

这是一个非常常见的JavaScript绊脚石的实例; Stackoverflow上有许多其他类似的问题,但它们很难找到,因为在你知道问题所在之前很难知道你在寻找什么。

答案 1 :(得分:1)

您在方法中使用变量f,但该变量由所有方法共享,并包含最后一个方法的名称。

您可以使用函数创建一个范围,其中每个方法都将获得自己的变量f

for(var i=0;i<funcs.length;i++) {
  (function(f){
    Rabbit.prototype[f] = function ( line ) {
      alert("The " + this.type + " rabbit " + f + " '" + line + "'") ;
    };
  })(funcs[i]);
}

演示:http://jsfiddle.net/xou11bgu/4/