鏈?zhǔn)秸Z法寫法
我們調(diào)用多個(gè) Underscore 的方法熔任≡蟊荆可能會(huì)這么寫:
var arr = [1, 2, 3,4,5,6,7,8]
var res = _.filter(arr, i => i > 1)
res = _.map(res, i => i*2)
res = _.shuffle(res)
用 Underscore 的鏈?zhǔn)秸Z法來簡(jiǎn)化,如下
var arr = [1, 2, 3,4,5,6,7,8]
var res = _.chain(arr)
.filter(i => i > 1)
.map(i => i * 2)
.shuffle()
.value()
源碼實(shí)現(xiàn)
鏈?zhǔn)秸Z法本質(zhì)是捻爷,每次調(diào)用方法辈灼,都返回 Underscore 實(shí)例(this)。
我們先來看 chain
的源碼:
_.chain = function(obj) {
var instance = _(obj) // 生成實(shí)例也榄。
instance._chain = true // 用此變量來標(biāo)識(shí):方法是返回原始值還是 Underscore 實(shí)例
return instance;
}
在生成實(shí)例的過程中巡莹,會(huì)將值存起來。源碼如下:
var _ = function(obj) {
if (obj instanceof _) return obj;
if (!(this instanceof _)) return new _(obj);
this._wrapped = obj; // 將當(dāng)前值存起來。
}
在 Underscore 用 mixin榕莺,將所有的靜態(tài)方法綁并到實(shí)例方法俐芯。源碼如下:
_.mixin = function(obj) {
_.each(_.functions(obj), function(name) {
var func = _[name] = obj[name];
_.prototype[name] = function() {
var args = [this._wrapped];
push.apply(args, arguments);
return result(this, func.apply(_, args));
};
});
};
// 將所有的靜態(tài)方法綁并到實(shí)例方法
_.mixin(_)
上面有一句關(guān)鍵代碼
return result(this, func.apply(_, args))
result
方法做的事就是在鏈?zhǔn)秸{(diào)用中,將實(shí)例傳遞下去钉鸯。源碼如下:
var result = function(instance, obj) {
return instance._chain ? _(obj).chain() : obj;
}
獲得最后結(jié)果的值吧史,調(diào)用 value
方法。源碼如下:
_.prototype.value = function() {
return this._wrapped;
};