我尝试从数组中定义原型函数。如下例所示:我的黑兔应该说'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");
可见
答案 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]);
}