我想在一个对象成员中存储一个函数,它在函数对象内部,但我需要通过名称访问它。下面的代码使人们更容易理解......
// MyClassThing.js:
var MyClassThing = (function() {
var _ref = {obj: undefined, fnc: undefined};
function setup(domObject, refName) {
_ref.obj = domObject;
_ref.fnc = this['func_' + refName]; // <<-- This does not work!!
}
function doThing() {
if(_ref.func)
_ref.fnc();
}
function func_foo() {
console.log('Foo!');
}
return {
setup: setup,
doThing: doThing
};
})();
// index.html
<script>
MyClassThing.setup($('#fooObj'), 'foo');
MyClassThing.doThing();
</script>
如何让_ref.fnc = ????
正常工作?
答案 0 :(得分:4)
您必须使用辅助对象将方法作为其属性。然后,您将能够通过变量名称来引用它们:
var MyClassThing = (function () {
var _ref = { obj: undefined, fnc: undefined },
methods = {};
function setup(domObject, refName) {
_ref.obj = domObject;
_ref.fnc = methods['func_' + refName];
}
function doThing () {
if (_ref.fnc) _ref.fnc();
}
methods.func_foo = function () {
console.log('Foo!');
};
return {
setup: setup,
doThing: doThing
};
})();
您不能使用this
因为它指向从IIFE返回的对象,但您感兴趣的方法不是此对象的属性。
答案 1 :(得分:0)
您的代码中存在拼写错误:
var MyClassThing = (function() {
var _ref = {obj: undefined, fnc: undefined};
function setup(domObject, refName) {
_ref.obj = domObject;
_ref.fnc = this['func_' + refName]; // <<-- This does not work!!
}
function doThing() {
if(_ref.fnc)
_ref.fnc();
}
function func_foo() {
console.log('Foo!');
}
return {
setup: setup,
doThing: doThing
};
})();
在doThing
函数中,您正在检查_ref.func
而不是_ref.fnc
要实现您想要做的事情,您需要了解使用“函数”声明的函数未链接到类。 javascript中没有“私有成员函数”的概念。如果你想将一个函数绑定到一个类,你需要像这样声明它(还有其他方法,我只是向你展示其中一个):
MyClassThing.prototype.func_foo = function () {
}
在您的情况下,最好的办法是直接将_ref.fnc
设置为func_foo
。如果您想保留this
上下文,请查看https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call