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
};
所以,我的问题是:
如此基本,但我是否正确描述了这一点?你怎么称呼这种可以链接的方法?并且,你称之为链中前一个方法的返回,下一个方法将在哪个方面运行?
如何将变量设置为链中前一个方法的返回值,或者作为参数提供?
谢谢!
答案 0 :(得分: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
,因此通常通过检查这些参数为空来处理
var exclaim = function(str, ch) {
if (ch == null){
ch = '!';
}
return string + ch
};
你经常会看到这样的事情:
var exclaim = function(str, ch) {
ch = ch || '!';
return string + ch
};
这类似,但会覆盖 6个“虚假”值中的任何:null
,undefined
,NaN
,0
,{ {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 + '!'
}