2016-04-14 60 views
0

在Lodash中發現的一種常見且非常可讀的模式是「鏈接」。通過鏈接,前一個函數調用的結果作爲下一個函數的第一個參數傳入。如何在Lodash中創建(可選)可鏈接的函數?

如從Lodash文檔這個例子:

var users = [ 
    { 'user': 'barney', 'age': 36 }, 
    { 'user': 'fred', 'age': 40 } 
]; 

// A sequence with chaining. 
_(users) 
    .head() 
    .pick('user') 
    .value(); 

headpick都可以鏈條之外被使用。

通過源代碼,鏈中調用的實際方法並沒有明顯的特殊性 - 所以它必須鏈接到最初的_調用和/或value調用。

頭:https://github.com/lodash/lodash/blob/4.11.0/lodash.js#L6443 採擷:https://github.com/lodash/lodash/blob/4.11.0/lodash.js#L12598

怎樣才能實現這種模式有自己的方法?它有一個術語嗎?

一個例子可能是:

const house = 
    this 
     .addFoundation("concrete") 
     .addWalls(4) 
     .addRoof(true) 
     .build(); 

// Functions being (each can be called by manually as well) 

addFoundation(house, materialType) { ... } 
addWalls(house, wallCount) { ... } 
addRoof(house, includeChimney) { ... } 

// And.. 
build() // The unwrapped method to commit the above 
+0

您正在尋找['_.mixin'](https://lodash.com/docs#mixin),它用於創建方法。 [這裏](https://github.com/lodash/lodash/blob/4.11.0/lodash.js#L15599)和[there](https://github.com/lodash/lodash/blob/4.11.0 /lodash.js#L14708)魔法發生。 – Bergi

回答

1

一個例子foo(不是原型)

foo.add = function(p) { 
    return foo([p]); 
} 

foo.add(3).print() // [3] 
+0

對不起,我花了一段時間來處理這一個 - 我喜歡 - 雖然是有道理的。並解釋爲什麼在lodash中你需要明確地調用_.chain並用'.value'解包它 – Chris

0

這就是所謂的方法鏈接。這裏有兩篇文章。它的基本要點是你在函數結束時返回當前對象。

http://schier.co/blog/2013/11/14/method-chaining-in-javascript.html

關於如何做到這一點

function foo(arr) { 
    if (!(this instanceof foo)) { 
    return new foo(arr); 
    } 

    this.arr = arr; 
    return this; 
} 


foo.prototype.add = function(p) { 
    this.arr.push(p); 
    return this; 
} 

foo.prototype.print = function() { 
    console.log(this.arr); 
    return this; 
} 

foo([1, 2]).add(3).print(); 

說你要做到這一點,以及

foo.add(3).print(); 

您需要在創建一個方法

http://javascriptissexy.com/beautiful-javascript-easily-create-chainable-cascading-methods-for-expressiveness/

+0

雅,漂亮的文章,但我認爲它只有一半的圖片(正確的我,我錯了) - 在Lodash你可以調用_.pick(object,'x')'以及_。(object).pick ('x'),其中前一個操作的結果作爲下一個的第一個參數傳入。在上面的文章中,涵蓋了鏈條,但不包括可選鏈 – Chris

相關問題