从ES6中的类调用动态方法

时间:2015-07-06 14:15:29

标签: javascript ecmascript-6

如何从ES6中的类动态调用方法?

在ES5及更低版本中,我可以使用以下内容执行此操作。 JSFiddle example

var App = function() {

    var that = this;

    this.init = function() {
        var elements = document.getElementsByClassName('call-method');

        for(var i = 0; i < elements.length; i++) {
            elements[i].addEventListener('click', function() {
                that['method' + this.dataset.method](this);
            });
        }
    };

    this.methodOne = function(element) {
        console.log(element.innerText);
    };

    this.methodTwo = function(element) {
        console.log(element.innerText);
    };

};

(function() {
    var app = new App();

    app.init();
}());

当我尝试在ES6中执行相同操作时,我收到错误Uncaught TypeError: not a function。在ES6中这是可能的还是我在这里做错了什么? JSFiddle example

'use strict';

class App {

    constructor() {
        var elements = document.getElementsByClassName('call-method');

        for(var i = 0; i < elements.length; i++) {
            elements[i].addEventListener('click', function() {
                this.constructor['method' + this.dataset.method](this); // Uncaught TypeError: not a function
                App['method' + this.dataset.method](this); // Uncaught TypeError: not a function
            });
        }
    }

    methodOne(element) {
        console.log(element.innerText);
    }

    methodTwo(element) {
        console.log(element.innerText);
    }

}

(function() {
    new App();
}());

2 个答案:

答案 0 :(得分:5)

我认为您误解了ES6课程的工作原理。你的第一个策略不会起作用,因为this.constructor是一个方法,而不是对任何构造函数类的引用。第二个不会起作用,因为那只会引用静态方法。

相反:

constructor() {
    var elements = document.getElementsByClassName('call-method');

    for(var i = 0; i < elements.length; i++) {
        elements[i].addEventListener('click', (e) => {
            this['method' + e.target.dataset.method](e);
        });
    }
}

同样arrow functions将是绑定事件的更好方法。

修改:更新了您的小提琴以显示其实际效果 - http://jsfiddle.net/dqk8n3xk/3/

答案 1 :(得分:2)

您可以执行以下操作:

'use strict';

class App {

    constructor() {
        var that = this;

        var elements = document.getElementsByClassName('call-method');

        for(var i = 0; i < elements.length; i++) {
            elements[i].addEventListener('click', function() {
                that['method' + this.dataset.method](this);
            });
        }
    }

    methodOne(element) {
        console.log(element.innerText);
    }

    methodTwo(element) {
        console.log(element.innerText);
    }

}

(function() {
    new App();
}());

如此jsfiddle

所示