根据名称动态调用函数

时间:2017-03-02 11:59:27

标签: javascript

所以我有一个注册事件监听器的原型对象。侦听器接收一个对象和一个指示发出事件源的字符串。 该对象将是一些函数调用的参数(_convertToX(someObj)_convertToY(someObj),...) 现在我要做的是动态调用我的convert函数(因为将来可能会添加更多函数),每个函数只需要一个参数(someObj )。

// constructor
const MyFactory = function () {
    // ...

    $rootScope.$on('someObj:changed', (event, someObj, source) => {
        // TODO: call converters dynamically, but not the one which converts back to the source
        // source can be 'X', 'Y' or 'Z'
    });
}

MyFactory.prototype._convertToX = function (someObj) {
    // TODO: convert to X and emit
};

MyFactory.prototype._convertToY = function (someObj) {
    // TODO: convert to Y and emit
};

MyFactory.prototype._convertToZ = function (someObj) {
    // TODO: convert to Z and emit
};

关于SO的类似问题可能已有答案,但我不知道如何找到合适的搜索字词......

我的方法是创建一个包含所有converter函数的数组,并从数组中调用它们。我看到的问题是如何确保我不会调用转换回source的转换器?

/**
 * Hold references to all converters.
 * @type {Array<function>}
 */
this._converters = [
    this._convertToX,
    this._convertToY,
    this._convertToZ
];

// assume source is 'Z'
$rootScope.$on('someObj:changed', (event, someObj, source) => {
    // how to call each function in this._converters with someObj as argument
    // except this._convertToZ(someObj) ?
});

这是一种干净的方法吗?怎么做?
或者是否有更简洁的方法来实现它?

1 个答案:

答案 0 :(得分:3)

您可以使用Bracket notation根据字符串文字

访问该功能
const MyFactory = function () {
    //Store the reference to a variable
    const self = this;

    $rootScope.$on('someObj:changed', (event, someObj, source) => {
        //Use Bracket notation to access the function
        self["_convertTo" + source](someObj)
    });
}

根据评论,除了source之外,我建议你创建一个sources列表,然后在事件处理程序中获取除source之外的所有方法并执行它们。

const MyFactory = function () {
    //Store the reference to a variable
    const self = this;
    const sources = ['X', 'Y', 'Z'];

    $rootScope.$on('someObj:changed', (event, someObj, source) => {
        //Use Bracket notation to access the function
        var expectSource = sources.filter(x => x !== source);
        expectSource.forEach(x => self["_convertTo" + x](someObj))          
    });
}