我的javascript模块中有以下代码,但是这需要我让这些功能对外界可见。
var mymodule = function() {
var self = null,
init = function () {
self = this;
$('.actionButton').click(function () {
var worklistId = $(this).data('worklistid'),
action = $(this).data('action');
self[action] && self[action](worklistId); //watchout methods marked as not used are used by this invocation
})
},
send = function () {
// some logic
},
finish = function () {
// some logic
},
delete = function () {
// some logic
};
return {
init: init,
send: send,
finish: finish,
delete: delete
};
}();
mymodule.init();
所以我想在模块中返回的唯一内容是init函数。但是当我这样做时,我无法调用这些函数,因为对象(self)只包含外部可见的init函数。
return {
init: init
};
是否有任何解决方案可以调用我的功能,而不会让外界看到它们?请不要if else语句,因为我的工作流程比本例中的3个动作大。我想让我的模块尽可能关闭,因为这会减少依赖性。
更新
这是一个更新的jsfiddle与建议的解决方案之一,但这给了我另一个问题。 http://jsfiddle.net/marcofranssen/bU2Ke/
答案 0 :(得分:0)
是的,有一种简单(但可能稍微凌乱)的方式,你可以做到这一点,而不会使全局对象的功能可见:
var privateFunctions = { deleter: deleter, send: send};
然后,而不是self[action]();
,只需privateFunctions[action]();
,你就可以了。
请注意,我已将delete
更改为deleter
,因为delete
是保留关键字...
答案 1 :(得分:0)
这样的事情会起作用:
var mymodule = function() {
var self = this;
init = function () {
$('.actionButton').click(function () {
var worklistId = $(this).data('worklistid'), action = $(this).data('action');
self[action] && self[action](worklistId); //watchout methods marked as not used are used by this invocation
})
}
self.send = function () {
console.log('send');
}
self.finish = function () {
console.log('finish');
}
self.delete = function (item) {
console.log('delete');
};
return {
init: init,
};
}();
mymodule.init();
这是小提琴:
http://jsfiddle.net/yngvebn/SRqN3/
将self
- 变量设置为this
,位于init
- 函数之外,并附加send
,finish
和delete
函数自我,您可以使用self[action]
- 函数
init
语法
答案 2 :(得分:0)
var mymodule = function() {
var self = {},
init = function () {
$('.actionButton').click(function () {
var worklistId = $(this).data('worklistid'),
action = $(this).data('action');
self[action] && self[action](worklistId); //watchout methods marked as not used are used by this invocation
})
};
self.send = function () {
// some logic
};
self.finish = function () {
// some logic
};
self.delete = function () {
// some logic
};
return{
init:init
}
}();
mymodule.init();
这应该工作!!
答案 3 :(得分:0)
即使您只使用init属性返回一个对象,并且您动态填充其余对象以使模块使用它们,您仍然可以在运行时将它们显示在外部。任何想要调试模块的人都可以轻松找到他们。
您仍然可以在运行时创建匿名方法,并且它们也可以与其实现一起显示。
答案 4 :(得分:0)
在您的代码示例中,“self
”实际上是模糊的。你应该保持简单,使用封装函数作为“私有”方法,并返回有权访问它们的“公共”(或“特权”,如Crockford所称)。
这是使用私有函数和变量进行单例的YUI方式。示例模式:
var mymodule = (function() {
var internal = {
'send': function() {},
'finish': function() {},
'delete': function() {}
};
return {
'init': function(action) {
// access to internals, f.ex:
if ( internal.hasOwnProperty(action) ) {
internal[action].call(this); // bring the caller context
}
}
};
}());
mymodule.init('send');