是否可以有一个对象方法 return 一个函数对象,如果可以,你如何访问它?

Is it possible to have an object method return a function object and if so how do you access it?

例如,如果我有:

var model = {
    updateCat: function(cat){
         var foo1 = function(){
                 //do something
             };
         var foo2 = function(){
                 //do something else
             };
         return{foo1: foo1, foo2: foo2};
    }
};

model.updateCat.foo1(cat); //does not work

做我想做的事情的最佳方法是什么?只创建单独的对象方法会更好吗?

您需要在 model.updateCat 之后加上括号,这样它就是 model.updateCat().foo1()。这是因为 updateCat 本身是一个函数,需要调用它才能 return foo1/foo2 对象。

此外,updateCat 函数似乎采用参数 cat,而不是 foo1,因此 .foo1(cat) 不正确。

var model = {
    updateCat: function(cat){
         var foo1 = function(){
                 //do something
             };
         var foo2 = function(){
                 //do something else
             };
         return{foo1: foo1, foo2: foo2};
    }
};

model.updateCat(cat).foo1(); //does work

或者,您可以内联调用 updateCat 函数,使 updateCat 成为对该函数结果的引用。请注意,这仅在您仅使用一个 cat 时有效,因为调用 updateCat(cat) 的结果已存储并且匿名函数丢失。

var model = {
    updateCat: (function(cat){
         var foo1 = function(){
                 //do something
             };
         var foo2 = function(){
                 //do something else
             };
         return{foo1: foo1, foo2: foo2};
    })(cat)
};

model.updateCat.foo1(); //does work

如果你想把它变成一个对象:

(function() {
  var foo1 = function() {}
  var foo2 = function() {}
  var model = {
     updateCat: {foo1: foo1, foo2: foo2}
  }
  window.model = model;
})();

或者如果您想使用 return 关键字:

var model = (function() {
  var foo1 = function() {}
  var foo2 = function() {}
  var model = {
     updateCat: {foo1: foo1, foo2: foo2}
  }
  return model;
  // also return like this:
  // return { updateCat: {foo1: foo1, foo2: foo2};
})();

现在您可以:

model.updateCat.foo1(cat);

允许您链接方法的另一种有趣方式:

var model = {
    updateCat : {
        foo1 : function( cat ) {
           // do tha thing
           return this;
        },
        foo2 : function( cat ) {
           // do things
           return this;
        }
    }
};

model.updateCat.foo1(cat);           //does work
model.updateCat.foo1(cat).foo2(cat); //does work

在您的示例中,updateCat 是一个未执行的函数,因此您不执行它 (),而是尝试像使用对象一样使用它 ({}) updateCat.foo1 因此您可能会收到一条错误消息

Expected an assignment or function call and instead saw an expression

为了你的model.updateCat.anythingHereIsUnreachable( bla );