我想调用一个函数两次但不是通过传统的方式。我将要做的一个简单示例如下:
var myfunc = {
copy: function(message){
console.log(message);
}
}
myfunc.copy('hello').copy('world');
// result 'hello'
// result 'world'
这甚至可能吗?
答案 0 :(得分:3)
是的,但你应该返回正确的对象:
var myfunc = {
copy: function(message){
console.log(message);
return this;
}
};
myfunc.copy('hello').copy('world');
// hello
// world
此技术也称为Method chaining。
答案 1 :(得分:1)
不会,这会失败,因为.copy()不会返回任何内容,所以第二个.copy()会抛出一个未定义的错误。
试试这个:
var myfunc = {
copy: function(message){
console.log(message);
return this;
}
}
答案 2 :(得分:0)
它被称为方法链。这是一个关于此的博客,您应该能够阅读并使用它来回答您的问题。
基本上你需要使用return this;
来返回当前对象,以便下一个方法可以使用它。
// define the class
var Kitten = function() {
this.name = 'Garfield';
this.color = 'brown';
this.gender = 'male';
};
Kitten.prototype.setName = function(name) {
this.name = name;
return this;
};
答案 3 :(得分:0)
你需要链接这个,你也可以查看jquerys $ .fn他们如何创建方法链接简单地返回它,因为这个对象是你的myFunc变量并且被下一个函数再次使用
var myfunc = {
copy: function(message){
console.log(message);
return this;
}
};
myfunc.copy('hello').copy('world');
答案 4 :(得分:0)
正如其他答案所指出的那样,您需要返回this
才能在同一对象上调用相同或附加的函数。
您可以通过我们称之为“chainify”的高阶函数更轻松地执行此操作(?),该函数负责为您返回this
:
function chainify(fn) {
return function() {
fn.apply(this, arguments);
return this;
};
}
您可以通过各种方式对对象方法进行链式化,但这里只有一个:
var myfunc = {
init: function() {
this.copy = chainify(this.copy);
return this;
},
copy: function(message){
console.log(message);
}
}.init();
这有一个小优势,即每个方法都不需要在最后使用return this
混乱,并且您不会冒被遗忘的风险。
答案 5 :(得分:0)
这是一种已知的Builder设计模式,其中包含级联方法。谷歌如果它有帮助。