访问JS函数的私有方法

时间:2015-07-22 14:03:59

标签: 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) {
            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});时,它应该调用私有div函数。我尝试过的东西不起作用。我怎样才能做到这一点。

DEMO

2 个答案:

答案 0 :(得分:3)

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

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

您可以使用methods[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'}) );

答案 1 :(得分:0)

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