3

我终于问这个问题了,因为我从来没有真正找到答案。如果我有一个结构如下的 javascript 对象:

var someObj = {

    "categoryA" : {
        "func1" : function(){},
        "func2" : function(){},
    },

    "categoryB" : {
        "func3" : function(){},
        "func4" : function(){},
    }

}

func4想打电话func2。我有什么方法可以不说就叫someObj.func2()吗?在我看来,这很丑陋,因为它确保应用程序不能轻易重命名,并且似乎更紧密地耦合了内部功能。或者这只是它通常的组织方式并且不被视为问题?

4

3 回答 3

1

您始终可以将您的对象声明重构为如下所示的内容:

var someObj = (function() {

    function func1(){}
    function func2() {}
    function func3() {}

    function func4() {
        func2();
    }

    var self = {
        "categoryA" : {
            "func1" : func1,
            "func2" : func2,
        },

        "categoryB" : {
            "func3" : func3,
            "func4" : func4,
        }
    };

    return self;
}());

它通常被称为“模块模式”。

于 2012-06-17T21:40:51.777 回答
1

您可以使用一些“私有”变量名称在模块内部使用(在我的示例中为“me”)并将其“导出”到另一个变量以供外部使用(“someObj”)。

var someObj = (function(){
  var me = {
    A:{
      fn1:function() {return 1}
    },
    B:{
      fn2:function() {return me.A.fn1()}
    }
  };
  return me;
})();

someObj.B.fn2()
于 2012-06-17T21:53:43.837 回答
1

由于以下原因,这实际上是不可能的。想象一下这样的事情:

var obj1 = {}, obj2 = {};

var categoryA = {
    "func1" : function(){},
    "func2" : function(){},
};

var categoryB = {
    "func3" : function(){},
    "func4" : function(){},
};

obj1.categoryA = categoryA;
obj1.categoryB = categoryB;

obj2.categoryA = categoryA;
obj2.categoryB = categoryB;

你可以看到obj2.categoryB.func4()不知道该怎么做。

于 2012-06-17T21:47:50.600 回答