&引用;“朋友班”;在javascript中
我有一个创建小部件对象的工厂类。工厂对象需要在以后回调小部件对象的“私有方法”,以向其传递一些ajax信息。到目前为止,我提出的唯一实现是在小部件中创建一个公共方法,将私有方法返回给工厂,然后删除自身,工厂然后返回新的小部件,同时保留一个指向私有方法的指针。以下是一个简化的示例:&引用;“朋友班”;在javascript中,javascript,oop,friend-class,Javascript,Oop,Friend Class,我有一个创建小部件对象的工厂类。工厂对象需要在以后回调小部件对象的“私有方法”,以向其传递一些ajax信息。到目前为止,我提出的唯一实现是在小部件中创建一个公共方法,将私有方法返回给工厂,然后删除自身,工厂然后返回新的小部件,同时保留一个指向私有方法的指针。以下是一个简化的示例: function Factory() { var widgetCallback = null; this.ajaxOperation = function() { //some
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;
}
}
}
有没有更好的方法来达到我想要的效果,或者这是一个相当合理的方法?我知道它是有效的,只是好奇我是否遇到了我应该注意的任何陷阱。我对面向对象的JavaScript(我在GWT代码中主要使用一行或两行代码)不够熟悉,无法给出真正的答案(但我发现我的回复对于注释来说有点长…) 我认为自我修改类,听起来像是gotcha's的一个主要潜力 我个人更喜欢JavaScript、Ruby等语言,它们对你的能力没有限制(即使我必须在工作中使用Java+GWT,呵呵),但你可以依靠自律来避免做愚蠢的事情。我宁愿在方法名前面加上“_”(并在不应该使用的地方避免使用它),也不愿尝试强制使用私有方法。由于JavaScript本质上是不受限制的,你可以做一些疯狂的事情,所以它需要很多规则 如果使用后删除了某个方法;为了保护它,你能不能简单地添加一个新的方法来保护它?无论如何,你还是会依靠你(和其他人)的自律和理智,不是吗
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];
}
只需让构造函数返回一个元组
或者,只需使用闭包范围直接在小部件中编辑widgetCallback
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;
}
}
}
JavaScript是JavaScript,不是艾达或C++或java。你可以做语言允许你做的事情,但是你应该经常问自己,你是否只是为了复杂而把它复杂化。仅仅采用简单的解决方案并没有什么害处。这是一种脚本语言,不是一种军事工具。虽然我完全同意@entonio,但在这里,我没有看到任何陷阱。这段代码似乎很好用。@Mihsath编写这样的代码会导致后续问题。它可以工作,但不是推荐的样式请在private/internal方法前面加上。
这是事实上的标准。是的,我现在记得你说过,我已经有一段时间没有真正编写纯JavaScript了……)@SteinGStrindhaug只有在滥用损坏的js引擎的情况下才能添加新方法。使用\uuu
不是标准,应该加以劝阻。使用局部变量和闭包可以提供真正的隐私。