我如何从javascript中返回的对象引用私有方法
How can i reference a private method from returned object in javascript?
从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"]
}
}
})()
因为返回值仍然在闭包内,所以可以直接调用hello
。所以:
hello();
要使其"动态",正如其他答案所建议的那样,您需要将hello
保存为某些东西。如果您想将它附加到this
而不是另一个对象,您只需要存储对this
的引用,以便以后可以访问它。
var HelloWorld = (function(){
var self = this;
this.hello = function(){
console.log("hello")
};
return {
addToList: function(){
self["hello"]();
}
}
})();
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);
}
}
})()
因此,您不能像示例代码注释中提到的那样"动态地"引用函数hello
。(我假设你对"动态"的定义是给定一个包含单词"hello"的字符串,并以某种方式使用它来引用函数hello
。)
但是,您可以将hello移动到对象中,并使用方括号符号从该对象中引用它:
var HelloWorld = (function () {
var privateCode = {
hello: function () {
console.log('hello');
}
};
return {
addToList: function () {
// access via `privateCode['hello']()`
}
};
}());
你不能使用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](); }
}
};
由于hello
仅存在于匿名IIFE的作用域中,因此您需要将其存储在某个中间对象中,以便能够从公共方法动态访问hello
:
var HelloWorld = (function(){
var privates = {
hello: function (){
console.log("hello")
}
};
return {
addToList: function (){
privates['hello']();
}
}
})();
HelloWorld.addToList();
工作示例相关文章:
- 这两种不同的创建对象文字的方法有什么区别
- 创建自定义 Javascript 对象的惯用方法有哪些
- 是否有任何方法可以像处理jQuery中附加到XHR延迟对象的done方法处理程序一样处理websocket onmess
- 检查jQuery对象是否有一些DOM元素的最快方法
- 哪种方法代表了 JavaScript 中空对象引用的最佳实践,null 或未定义
- 在Javascript中声明一个对象上的方法时,如何正确引用该对象上的一个方法集
- Box2dWeb中是否有方法将对象的位置.x输出到console.log()
- 如何在其内部引用jQuery对象'的方法调用
- 通过引用复制对象是否有实际用途
- 正确检测抽象对象/引用类型的方法
- 是否有其他方法传递对象引用到javascript匿名函数
- 在Javascript中,方法附加到原型或对象实例有什么区别?
- 在反序列化JSON对象时,是否有方法将属性名称转换为小写?
- 为什么JS允许对象属性同时“引号”?和引用?有区别吗?
- 在对象构造函数中定义方法和将方法附加到构造函数的原型对象中有什么有用的区别吗?
- 在原型设计时跟踪javascript对象引用的最佳方法是什么?
- 为什么在方法上调用(call)和在对象上调用方法是有区别的
- 检查Flash对象是否有来自JavaScript的方法
- 检查对象是否有方法,而不实例化它
- 我如何从javascript中返回的对象引用私有方法