按名称引用方法功能?

时间:2015-05-28 18:45:01

标签: javascript

我想在一个对象成员中存储一个函数,它在函数对象内部,但我需要通过名称访问它。下面的代码使人们更容易理解......

// MyClassThing.js:

var MyClassThing = (function() {
    var _ref = {obj: undefined, fnc: undefined};

    function setup(domObject, refName) {
        _ref.obj = domObject;
        _ref.fnc = this['func_' + refName]; // <<-- This does not work!!
    }

    function doThing() {
        if(_ref.func)
            _ref.fnc();
    }

    function func_foo() {
        console.log('Foo!');
    }

    return { 
        setup: setup,
        doThing: doThing
    };
})();

// index.html

<script>
MyClassThing.setup($('#fooObj'), 'foo');
MyClassThing.doThing();
</script>

如何让_ref.fnc = ????正常工作?

2 个答案:

答案 0 :(得分:4)

您必须使用辅助对象将方法作为其属性。然后,您将能够通过变量名称来引用它们:

var MyClassThing = (function () {

    var _ref = { obj: undefined, fnc: undefined },
        methods = {};

    function setup(domObject, refName) {
        _ref.obj = domObject;
        _ref.fnc = methods['func_' + refName];
    }

    function doThing () {
        if (_ref.fnc) _ref.fnc();
    }

    methods.func_foo = function () {
        console.log('Foo!');
    };

    return {
        setup: setup,
        doThing: doThing
    };
})();

您不能使用this因为它指向从IIFE返回的对象,但您感兴趣的方法不是此对象的属性。

答案 1 :(得分:0)

您的代码中存在拼写错误:

var MyClassThing = (function() {
    var _ref = {obj: undefined, fnc: undefined};

    function setup(domObject, refName) {
        _ref.obj = domObject;
        _ref.fnc = this['func_' + refName]; // <<-- This does not work!!
    }

    function doThing() {
        if(_ref.fnc)
            _ref.fnc();
    }

    function func_foo() {
        console.log('Foo!');
    }

    return { 
        setup: setup,
        doThing: doThing
    };
})();

doThing函数中,您正在检查_ref.func而不是_ref.fnc

的存在性

要实现您想要做的事情,您需要了解使用“函数”声明的函数未链接到类。 javascript中没有“私有成员函数”的概念。如果你想将一个函数绑定到一个类,你需要像这样声明它(还有其他方法,我只是向你展示其中一个):

MyClassThing.prototype.func_foo = function () {

}

在您的情况下,最好的办法是直接将_ref.fnc设置为func_foo。如果您想保留this上下文,请查看https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call