是否有可能让对象方法返回一个函数对象,如果是这样,你如何访问它?

时间:2015-06-02 19:48:23

标签: javascript javascript-objects

例如,如果我有:

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

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

3 个答案:

答案 0 :(得分:2)

另一种有趣的方法,可以让你链接你的方法:

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因此您可能会收到错误消息

  

期望分配或函数调用,而是看到表达式

代表model.updateCat.anythingHereIsUnreachable( bla );

答案 1 :(得分:0)

model.updateCat之后需要括号,使其为model.updateCat().foo1()。这是因为updateCat本身是一个需要调用的函数,以便返回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

答案 2 :(得分:0)

如果要将其更改为对象:

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

或者如果你想使用return keyword:

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);