哪个是在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"]
}
}
})()
答案 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();