我有一个用于创建Widget对象的Factory类。 Factory对象需要稍后回调Widget对象的“私有方法”以向其传递一些ajax信息。到目前为止,我提出的唯一实现是在Widget中创建一个公共方法,将私有方法返回到工厂,然后删除自己,然后Factory返回新的Widget,同时保留指向私有方法的指针。这是一个简化的例子:
function Factory()
{
var widgetCallback = null;
this.ajaxOperation = function()
{
//some ajax calls
widgetCallback('ajaxresults');
}
this.getNewWidget = function()
{
var wid = new Widget();
widgetCallback = wid.getCallback();
return wid;
}
function Widget()
{
var state = 'no state';
var self = this;
var modifyState = function(newState)
{
state = newState;
}
this.getState = function()
{
return state;
}
this.getCallback = function()
{
delete self.getCallback;
return modifyState;
}
}
}
有没有更好的方法来实现我所追求的效果,还是这是一种相当合理的方法?我知道它有效,只是好奇我是否正在踩到任何我应该知道的陷阱。
答案 0 :(得分:1)
this.getNewWidget = function() {
var val = new Widget(),
wid = val[0],
widgetCallback = val[1];
return wid;
}
function Widget() {
var state = 'no state';
var self = this;
var modifyState = function(newState) {
state = newState;
}
this.getState = function() {
return state;
}
// Return tuple of Widget and callback
return [this, modifyState];
}
让你的构造函数返回Tuple<Widget, function>
替代方法只是使用闭包范围直接在widgetCallback
构造函数
Widget
function Factory() {
var widgetCallback = null;
this.ajaxOperation = function() {
//some ajax calls
widgetCallback('ajaxresults');
}
this.getNewWidget = function() {
return new Widget();;
}
function Widget() {
var state = 'no state';
var self = this;
// set it directly here!
widgetCallback = function(newState) {
state = newState;
}
this.getState = function() {
return state;
}
}
}
答案 1 :(得分:0)
我对面向对象的JavaScript(我在GWT代码中主要使用一两个内衬)不太熟悉,实际上给出了一个真正的答案(但我发现我的回答有点长了评论... )
我认为自我修改类,听起来像是一个主要的潜力。
我个人更喜欢JavaScript,Ruby等语言,这些语言对你能做的事情没有限制(即使我必须在工作中使用Java + GWT,呵呵),但你依赖自律而不做愚蠢的东西。我宁愿在方法名称前加上“_”(并且只是避免在我不应该使用的地方使用它),而不是试图强制执行私有方法。由于JavaScript在你可能做的疯狂事情中非常不受限制,因此无论如何都需要大量的训练。
如果您在使用后删除了某个方法;为了保护它,你能不能轻易地添加一种新的方法来做同样的事情?无论如何,你仍然会依赖你(和其他人)的自律和理智,不是吗?