是否可以有一个对象方法 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 );
例如,如果我有:
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 );