如何在javascript中引用返回对象的私有方法?

时间:2013-01-18 18:52:28

标签: javascript reference closures

哪个是在javascript中从返回的对象引用私有方法的最佳方法?我给你留下一些示例代码:

var HelloWorld = (function(){
    var hello = function(){
        console.log("hello")
    },
    return{
        addToList: function(){
            //how can i reference hello from here dynamically like:
                            //this["hello"] or this["hell" + "o"]
        }       
    }
})()

5 个答案:

答案 0 :(得分:2)

因为返回仍然在闭包内,你可以直接调用hello。所以:

hello();

要使其成为动态",正如其他答案所推荐的那样,您需要将hello保存到某个位置。如果您想将其附加到this而不是其他对象,则只需存储对this的引用,以便稍后访问它。

var HelloWorld = (function(){
  var self = this;
  this.hello = function(){
    console.log("hello")
  };
  return {
    addToList: function(){
        self["hello"]();
    }       
  }
})();

答案 1 :(得分:1)

hello()不是一种方法。它只是一个闭包中的函数。因此,您可以在addToList()方法中调用它。

如果您希望hello函数的行为类似于将this设置为对象实例的方法,则必须按照此示例将实例传递给它。

var HelloWorld = (function(){
    var hello = function(){
        console.log("hello")
    },
    return{
        addToList: function(){
            //how can i reference hello from here dynamically like:
            hello.call(this);
        }       
    }
})()

如果您真正想要做的是通过字符串引用访问hello函数,则无法通过字符串名称轻松访问本地变量。如果你想这样做,你可能必须把hello函数放到这样的本地对象中:

var HelloWorld = (function(){
    var locals = {
        hello: function(){
            console.log("hello")
        }
    };
    return{
        addToList: function(){
            //how can i reference hello from here dynamically like:
            locals["hello"].call(this);
        }       
    }
})()

答案 2 :(得分:1)

按原样,您无法动态引用函数hello“,如示例代码的注释中所述。 (我假设你的“动态”定义是给一个包含单词“hello”的字符串,并以某种方式使用它来引用函数hello。)

但是,您可以将hello移动到一个对象中,并使用方括号表示法将其引用到该对象:

var HelloWorld = (function () {
    var privateCode = {
        hello: function () {
            console.log('hello');
        }
    };

    return {
        addToList: function () {
            // access via `privateCode['hello']()`
        }       
    };
}());

答案 3 :(得分:1)

您无法使用this,因为您尚未将其作为对象的一部分。

var HelloWorld = (function () {

    var hello = function () { console.log("hello"); };

    return {
        addToList : function () { hello(); }
    };

}());

这样可以正常工作。

如果您需要使用字符串访问它,那么您需要制作hello,那么您有两个选择:

1)创建一个公共函数,您可以使用字符串调用它,该字符串调用hello

return {
    command : function (string) { if (this[string]) { this[string](); },
    sayHello : function () { hello(); }
};

2)创建一个私有对象,它存储你的方法(然后你可以用字符串调用它):

var private_actions = {
    hello : function () { console.log("hello"); }
};

return {
    command : function (string) {
        if (private_actions[string]) { private_actions[string](); }
    }
};

答案 4 :(得分:1)

由于hello仅存在于匿名IIFE的范围内,因此您需要将其存储为一些中间对象,以便能够从公共方法动态访问hello

var HelloWorld = (function(){
    var privates = {
        hello: function (){
            console.log("hello")
        }
    };

    return {
        addToList: function (){
            privates['hello']();
        } 
    }
})();

HelloWorld.addToList();

Working Example