Underscore源碼閱讀:鏈?zhǔn)秸{(diào)用

chain

_.chain(lyrics)
  .map(function(line) { return line.words.split(' '); })
  .flatten()
  .reduce(function(counts, word) {
    counts[word] = (counts[word] || 0) + 1;
    return counts;
  }, {})
  .value();

Underscore支持鏈?zhǔn)秸{(diào)用募胃;不過要求函數(shù)鏈的開頭要用chain函數(shù)生成封裝對象。
看看chain到底做了啥灌砖。

  _.chain = function (obj) {
    var instance = _(obj);
    instance._chain = true;
    return instance;
  };

chain生成了返回了一個(gè)underscore實(shí)例

  var _ = function (obj) {
    if (obj instanceof _) return obj;
    if (!(this instanceof _)) return new _(obj);
    this._wrapped = obj;
  };

我們看到underscore實(shí)例就是一個(gè)掛載了_wrapper的對象刁品。

再接著,因?yàn)?code>_是個(gè)構(gòu)造函數(shù)回论,所有方法都是掛載在構(gòu)造函數(shù)上的散罕。
Underscore提供了mixin方法為Underscore對象進(jìn)行擴(kuò)展,我們看看傀蓉。

  _.mixin = function (obj) {
    _.each(_.functions(obj), function (name) {
      // 對傳入的obj欧漱,遍歷它所有的方法,先掛載在構(gòu)造函數(shù)上
      var func = _[name] = obj[name];
      // 并且所有的方法都會在原型上重寫葬燎;
      _.prototype[name] = function () {
        var args = [this._wrapped];
        push.apply(args, arguments);
        return result(this, func.apply(_, args));
      };
    });
  };

  _.mixin(_);

Underscore通過mixin將原來掛載在構(gòu)造函數(shù)上所有的方法误甚,全部在_的原型上重寫缚甩,這次重寫,直接指定了underscore所有方法的第一個(gè)參數(shù)為this._wrapped窑邦,也就是構(gòu)造函數(shù)攜帶的參數(shù)擅威。

然后看看最后為了鏈?zhǔn)秸{(diào)用返回的result函數(shù)。明顯支持這種“不帶”第一個(gè)參數(shù)的寫法是只能寫在underscore實(shí)例上的冈钦。所以在原型上重寫的方法郊丛,最后返回的仍然是underscore實(shí)例。

var result = function (instance, obj) {
    return instance._chain ? _(obj).chain() : obj;
};

也就是說瞧筛,underscore的鏈?zhǔn)秸{(diào)用一直返回的是一個(gè)_的實(shí)例厉熟,_的構(gòu)造方法不僅掛載了全部underscore的方法,并且在原型上重寫了這些方法较幌,使得_的實(shí)例可以不用傳遞第一個(gè)參數(shù)而進(jìn)行鏈?zhǔn)秸{(diào)用庆猫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市绅络,隨后出現(xiàn)的幾起案子月培,更是在濱河造成了極大的恐慌,老刑警劉巖恩急,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杉畜,死亡現(xiàn)場離奇詭異,居然都是意外死亡衷恭,警方通過查閱死者的電腦和手機(jī)此叠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來随珠,“玉大人灭袁,你說我怎么就攤上這事〈翱矗” “怎么了茸歧?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長显沈。 經(jīng)常有香客問我软瞎,道長,這世上最難降的妖魔是什么拉讯? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任涤浇,我火速辦了婚禮,結(jié)果婚禮上魔慷,老公的妹妹穿的比我還像新娘只锭。我一直安慰自己,他們只是感情好院尔,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布蜻展。 她就那樣靜靜地躺著页滚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铺呵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天隧熙,我揣著相機(jī)與錄音片挂,去河邊找鬼。 笑死贞盯,一個(gè)胖子當(dāng)著我的面吹牛音念,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播躏敢,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼闷愤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了件余?” 一聲冷哼從身側(cè)響起讥脐,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎啼器,沒想到半個(gè)月后旬渠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡端壳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年告丢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片损谦。...
    茶點(diǎn)故事閱讀 40,973評論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡岖免,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出照捡,到底是詐尸還是另有隱情颅湘,我是刑警寧澤,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布栗精,位于F島的核電站栅炒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏术羔。R本人自食惡果不足惜赢赊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望级历。 院中可真熱鬧释移,春花似錦、人聲如沸寥殖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至熏纯,卻和暖如春同诫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背樟澜。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工误窖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秩贰。 一個(gè)月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓霹俺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親毒费。 傳聞我的和親對象是個(gè)殘疾皇子丙唧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評論 2 361