2012-12-13 13 views
1

JS新手的问题在这里: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

连锁它们,那么你就必须将这些方法添加到字符串原型:

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

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

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

DEMO


WRT可选参数,您可以利用事实th在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“falsy”值:nullundefined,NaN0,false''(空字符串)。所以,如果你这样做,并尝试传递ch的空字符串,它将被覆盖。

+0

嗯,是犹太?通过在原型中添加方法可以产生可链接的潜在问题吗? – Andrew

+0

@Andrew - 通常不建议将方法添加到内置对象的原型中,但如果您真的想要使这些可链接的,那么就是这样做的。 –

+1

真棒,非常有帮助的例子。谢谢! – Andrew

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'; 
1

你可以这样做:

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

或者你也可以延长String对象,这样就可以使用.prepend()和.exclaim()语法:

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

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