Javascript类-动态访问函数

Javascript类-动态访问函数,javascript,class,Javascript,Class,我有一个javascript类: MyClass = function(){ this.m_SomeData = 5; }; 我为该类创建了一些函数: MyClass.prototype.MyClassFunction_1 = function(arg){ // Some stuff that can return false return true; }; MyClass.prototype.MyClassFunction_2 = function(arg){

我有一个javascript类:

MyClass = function(){
    this.m_SomeData = 5;
};
我为该类创建了一些函数:

MyClass.prototype.MyClassFunction_1 = function(arg){
    // Some stuff that can return false
    return true;
};
MyClass.prototype.MyClassFunction_2 = function(arg){
    // Some stuff that can return false
    return true;
};
MyClass.prototype.MyClassFunction_3 = function(arg){
    // Some stuff that can return false
    return true;
};
稍后,我创建了该类的一个实例。(它们可以组合成一个单一的功能,但存在一些设计问题,使它们更易于分离):

现在是棘手的一点。在一个“如果”声明中,我正在做以下事情(以及其他事情)

最明显的问题是“if”语句MyClassFunction\ux?都是未定义的,因为它们应该绑定到类的一个实例,例如myInstance.MyClassFunction

那么如何在if语句中很好地实现这一点呢?

您可以这样做:

var funcUse =
    val === 0 ? 'MyClassFunction_1' :
    val === 1 ? 'MyClassFunction_2' :
    'MyClassFunction_3';

if (myInstance[funcUse] && myInstance[funcUse](arg)) {
    ...
}
点表示法(
obj.property
)只是
obj[“property”]
的语法糖,因此您可以简单地将
funcUse
设置为字符串


或者,您也可以执行以下操作:

var funcUse =
    val === 0 ? myInstance.MyClassFunction_1 :
    val === 1 ? myInstance.MyClassFunction_2 :
    myInstance.MyClassFunction_3;

if (funcUse && funcUse.call(myInstance, arg)) {
    ...
}
这将从
myInstance
对象中提取函数,但是在调用
funcUse
时必须小心,以确保
myInstance
作为
This

传递,不要担心“类”继承,您要解决的问题实际上是两个更简单的问题

  • 动态访问对象的属性
  • 选择函数的上下文/
  • 关于使用哪种模式,您有两种选择


    fn.call
    /
    fn.apply

    var o = {foo: 'bar'};
    
    function fizz() {return this;}
    
    fizz.call(o); // returns `o`, Object {foo: 'bar'}
    

    括号符号

    var o = {foo: function () {return this}};
    
    o['foo'](); // returns `o`
    

    在您的特定情况下,我可能会使用
    开关..case
    if..else
    模式来确定属性名称,然后使用括号符号调用

    var method;
    switch (val) {
        case 0: method = 'foo'; break;
        case 1: method = 'bar'; break;
    }
    
    if (method)
        o[method]();
    

    方法只是具有函数值的属性。你也可以用括号来表示它们。那不是类,那是函数。嗨@Bergi,你能解释一下你的意思吗?(@melpomene-这是在javascipt中创建类的一种方法。)@Rewind:不,构造函数不是类。感谢您提供的信息性输入。我在梅尔波默尼的回答上打了个记号,因为它是第一次出现的。但再次感谢你。
    var o = {foo: function () {return this}};
    
    o['foo'](); // returns `o`
    
    var method;
    switch (val) {
        case 0: method = 'foo'; break;
        case 1: method = 'bar'; break;
    }
    
    if (method)
        o[method]();