2013-03-27 78 views
0

我正在尝试做一些类似Javascript的多态对象,我有一个对象'类型'的映射,每个对象都有自己的属性和函数,我可以调用它们。为什么不能用Javascript创建对象并引用内部函数?

虽然属性正常工作的功能不,我不明白为什么。在Firefox中我得到的错误:类型错误:this.functionmap【类型】.action不是一个函数

这里是我的代码:

var object = { 
    flapWings : function(count) { alert("I am flapping my wings "+count+" times"); }, 
    kick : function(count) { alert("I am kicking my legs "+count+" times"); }, 
    functionmap : { 
     "bird" : { label : "Bird", action : this.flapWings }, 
     "horse" : { label : "Horse", action : this.kick } 
    }, 
    doAction : function (type, count) { 
     alert("I am a "+this.functionmap[type].label); 
     this.functionmap[type].action(count); 
    } 
}; 

object.doAction("horse", 5); 

这里的jsfiddle例如:

http://jsfiddle.net/JKvyP/

我只是不明白为什么: 行动:this.kick没有得到正确的上面创建的踢功能的引用!我想避免像行动一样愚蠢的东西:function(count):this.kick(count);即使这不起作用 - 我想直接引用,而不必重新键入参数

+1

http://stackoverflow.com/questions/4616202/self-references-in-object-literal-declarations/10766107#10766107 – 2013-03-27 18:22:50

+2

因为在你的榜样'这是指'马'引用的对象? – Daedalus 2013-03-27 18:22:50

回答

1

您不能神奇地将参数传递给刚引用的函数,因此您需要一些匿名函数,并引用该对象直接在该范围等:

var object = { 
    flapWings : function(count) { 
     alert("I am flapping my wings "+count+" times"); 
    }, 
    kick : function(count) { 
     alert("I am kicking my legs "+count+" times"); 
    }, 
    functionmap : { 
     "bird" : { 
        label : "Bird", 
        action : function(param) { 
           object.flapWings(param); 
          } 
        }, 
     "horse" : { 
        label : "Horse", 
        action : function(param) { 
           object.kick(param); 
          } 
        } 
    }, 
    doAction : function (type, count) { 
     alert("I am a "+this.functionmap[type].label); 
     this.functionmap[type].action(count); 
    } 
}; 

object.doAction("horse", 5); 

FIDDLE

+0

谢谢,我想我现在明白为什么我的尝试不起作用。仍然有点消化它... :) – Trant 2013-03-27 18:42:14

相关问题