1

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!"我的结果。

如果我也可以将可选参数传递到这个链中,那就更好了,比如:

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

所以,我的问题是:

  1. 如此基本,但我是否正确描述了这一点?可以这样链接的方法叫什么?而且,您将链中前一个方法的返回称为什么,这个下一个方法将操作的东西?

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

谢谢!

4

3 回答 3

3

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

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

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

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

演示


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

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

你也会经常看到这样的东西:

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

这很相似,但会覆盖6 个“虚假”值中的任何null一个: 、undefinedNaN0false''空字符串)。因此,如果您这样做,并尝试为 ch 传递一个空字符串,它将被覆盖。

于 2012-12-13T16:30:14.847 回答
1

你可以这样做:

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

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

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

  String.prototype.exclaim = function() {
      return this + '!'
  }
于 2012-12-13T16:32:50.130 回答
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';
于 2012-12-13T16:30:04.770 回答