JS:如何创建可选的可链接方法

时间:2012-12-13 16:28:14

标签: javascript method-chaining

JS新手问题:

假设我有一些简单的字符串操作方法,比如这些愚蠢的例子:

var prepend = function(str) {
  return 'foo ' + str
};

var exclaim = function(str) {
  return str + '!'
}

现在,我可以像这样使用这些:

var string = prepend('bar'); // 'foo bar'
string = exclaim(string); // 'foo bar!'

然而,我认为如果我也可以,可选,使这些方法可链接,那将是非常好的,所以我也可以这样做:

var string = "foo"
string.prepend().exclaim()

......我的结果仍然是"foo bar!"

如果我还可以将可选的args传递到此链中,那将会更好,例如:

var exclaim = function(string,char="!") {
  return string + char
};

所以,我的问题是:

  1. 如此基本,但我是否正确描述了这一点?你怎么称呼这种可以链接的方法?并且,你称之为链中前一个方法的返回,下一个方法将在哪个方面运行?

  2. 如何将变量设置为链中前一个方法的返回值,或者作为参数提供?

  3. 谢谢!

3 个答案:

答案 0 :(得分:3)

如果你想链接它们,那么你必须将这些方法添加到字符串原型中:

String.prototype.prepend = function() {
  return 'foo ' + this
};

String.prototype.exclaim = function() {
  return this + '!'
}

var s = "".prepend().exclaim();
console.log(s);

DEMO


WRT可选参数,您可以利用以下事实:在JavaScript中,您可以调用方法而不传递某些参数的值。那些未通过的参数将在函数中显示为undefined。由于null隐式转换为undefined,因此通常通过检查这些参数为空来处理

var exclaim = function(str, ch) {
  if (ch == null){
      ch = '!';
  }
  return string + ch
};

你经常会看到这样的事情:

var exclaim = function(str, ch) {
  ch = ch || '!';
  return string + ch
};

这类似,但会覆盖 6个“虚假”值中的任何nullundefinedNaN0,{ {1}}和false(空字符串)。因此,如果你这样做,并尝试为ch传递一个空字符串,它将被覆盖。

答案 1 :(得分:1)

要使用可链式方法,您应该返回包含该方法的对象的实例。在大多数情况下,您将返回 this

请参阅此MyString类,例如

function MyString(s){
   this.str = s;
}
MyString.prototype.lower=function(){
   this.str = this.str.toLowerCase();
   return this;
}
MyString.prototype.upper=function(){
   this.str = this.str.toUpperCase();
   return this;
}
MyString.prototype.last=function(x){
   return this.str.substr(-x);
}
MyString.prototype.first=function(x){
   return this.str.substr(0,x);
}

MyString.prototype.get=function(){
   return this.str;
}


var ms = new MyString("Hello");
var s  = ms.lower().first(2); // s = 'he';

答案 2 :(得分:1)

你可以这样做:

 var string = exclaim(prepend('bar'));

或者您可以扩展String对象,以便可以使用.prepend()和.exclaim()语法:

  String.prototype.prepend = function() {
       return 'foo ' + this
  };

  String.prototype.exclaim = function() {
      return this + '!'
  }