Javascript 访问JS函数的私有方法

Javascript 访问JS函数的私有方法,javascript,function,constructor,javascript-objects,Javascript,Function,Constructor,Javascript Objects,我有以下javascript代码 function MyFunc () { var add = function () { return "Hello from add"; }; var div = function () { return "Hello from div"; }; var funcCall = function (obj) { if (!obj) { th

我有以下javascript代码

function MyFunc () {

    var add = function () {
        return "Hello from add";
    };

    var div = function () {
         return "Hello from div";
    };

    var funcCall =  function (obj) {

        if (!obj) {
            throw new Error("no Objects are passed");
        }
      return obj.fName();


    };

  return {
    func: function (obj) {
      funcCall(obj);
    }
  };

}

var lol = new MyFunc();
lol.func({fName:add})时时,它应该调用函数private function
add
或当
lol.func({fName:div})时时,它应该调用private div函数。我试过的不起作用。我怎样才能做到这一点


在这种情况下,最好将内部函数存储在对象中,以便使用变量名轻松访问该函数。所以如果你定义一个函数“映射”

您可以使用
方法[obj.fName]()调用它

完整代码:

function MyFunc() {

    var add = function () {
        return "Hello from add";
    };

    var div = function () {
        return "Hello from div";
    };

    var methods = {
        add: add,
        div: div
    };

    var funcCall = function (obj) {

        if (!obj) {
            throw new Error("no Objects are passed");
        }

        return methods[obj.fName]();
    };

    return {
        func: function (obj) {
            return funcCall(obj);
        }
    };

}

var lol = new MyFunc();
console.log( lol.func({fName: 'add'}) );

传递
lol.func({fName:add})时,
add在计算此代码的范围内解析,而不是在
MyFunc
的范围内解析。您必须在该范围内定义它,如:

function MyFunc () {

    var add = function () {
        return "Hello from add";
    };

    var div = function () {
         return "Hello from div";
    };

    var funcCall =  function (obj) {

        if (!obj) {
            throw new Error("no Objects are passed");
        }
      return obj.fName();


    };

  return {
    add: add,
    div: div,
    func: function (obj) {
      funcCall(obj);
    }
  };

}
var lol = new MyFunc();
lol.func({fName: lol.add});

或者使用
eval

我想只有
eval
可以做你想做的事情,而不需要更新你的代码。@Kyll这不是我要求的:)
function MyFunc () {

    var add = function () {
        return "Hello from add";
    };

    var div = function () {
         return "Hello from div";
    };

    var funcCall =  function (obj) {

        if (!obj) {
            throw new Error("no Objects are passed");
        }
      return obj.fName();


    };

  return {
    add: add,
    div: div,
    func: function (obj) {
      funcCall(obj);
    }
  };

}
var lol = new MyFunc();
lol.func({fName: lol.add});