javascript 子对象和定义模式

标签 javascript design-patterns

我一直在纠结这个问题,想知道是否有人能指出我正确的方向。

我有以下对象定义:

var foo=function(){};
foo.prototype={
  foo1:function(){},
  baz:{
    baz1:function(){}
  },
  bar:function(){
    function privateFunc1(){}
    function privateFunc2(){}
    return {
      bar1:function(){
        //do something using privateFunc1
        //return the result
      }
    };
  }
};

var foobar = new foo();

现在,要访问 baz 方法的 baz1 子方法,我可以执行 foobar.baz.baz1()
但是要访问 bar 方法的 bar1 子方法,我必须执行 foobar.bar().bar1() (注意 bar 之后的额外括号)

有没有一种方法可以定义 foo 对象,以便我可以使用 foobar.bar.bar1() 调用 bar1(注意,没有额外的括号),但是仍然在 bar 中使用私有(private)函数 privateFunc1privateFunc2 方法。

此外,请注意,我不能使 bar 成为自执行函数,因为它依赖于 foo 对象的可变属性,在函数拥有 self 后可能会发生变化-执行。

希望问题足够清楚...提​​前致谢。

最佳答案

这可能会朝着您想要的方向发展。 http://jsfiddle.net/Una9k/1/

var Foo = function() {
    this.mutableProperty = "mutable";
    this.bar = new Foo.prototype.Bar(this);
};
Foo.prototype = {
    constructor: Foo,
    Bar:function(context){
        var ctx = context;
        function privateFunc(){
            alert(ctx.mutableProperty);
        }
        return {
            bar1: function () {
                privateFunc();    
            }
        };
    }
};

var foobar = new Foo();
foobar.bar.bar1(); // alerts 'mutable'

foobar.mutableProperty = "changed";
foobar.bar.bar1(); // alerts 'changed'

关于javascript 子对象和定义模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6319680/

相关文章:

javascript - 使用chrome扩展获取网页中的所有超链接标题

javascript - 如何流式传输 blob

Java - 重构几乎相同的方法

java - 是否有一种设计模式可以帮助在通用显示器上配置命令?

.Net - session 外观和业务代表之间有什么区别?

c++ - 实例方法中的静态变量 - 如何解决?

oop - 如何避免 getter 和 setter

javascript - Angular 8 应用程序,当使用片段与标题重叠时

javascript - 使用 onmousedown 获取您刚刚按下鼠标的元素的 ID?

javascript - 重复有效负载(数据)如何减少网络套接字中的延迟?