Javascript类 - 即时访问函数

时间:2016-06-18 19:42:13

标签: 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){
    // Some stuff that can return false
    return true;
};
MyClass.prototype.MyClassFunction_3 = function(arg){
    // Some stuff that can return false
    return true;
};

后来我创建了该类的实例。 (它们可以组合成一个单独的功能,但是有一些设计问题可以使它们更好地分离出来):

var myInstance = new MyClass();

现在是棘手的一点。在' if'声明我正在做以下事情(以及其他事情)。

var funcUse;
var arg = 3; // Some value created at run time)
if((funcUse = val === 0 ? MyClassFunction_1
                        : (val === 1 ? MyClassFunction_2 : MyClassFunction_3)) !== "undefined" &&
    myInstance.funcUse(arg)){
}

显而易见的问题是“如果'声明MyClassFunction_?都是未定义的,因为它们应该绑定到类的实例,例如myInstance.MyClassFunction _?。

那么如何在if语句中很好地完成呢?

2 个答案:

答案 0 :(得分:2)

你可以这样做:

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传递。

答案 1 :(得分:1)

不要担心"类" /继承,你要解决的问题实际上是两个更简单的问题,

  1. 动态访问对象的属性
  2. 选择功能的上下文/ this
  3. 您可以选择使用哪种模式

    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`
    

    在您的特定情况下,我可能会使用switch..caseif..else模式来决定属性名称,然后使用括号表示法调用;

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