天天看點

[Effective JavaScript 筆記]第60條:支援方法鍊

無狀态的API的部分能力是将複雜操作分解為更小的操作的靈活性。一個很好的例子是字元串的replace方法。由于結果本身也是字元串,可以對前一個replace操作重複執行替換。這種模式的一個常見用例是在将字元串插入到HTML前替換字元串的特殊字元字母。

function escapeBasicHTML(str){
    return str.replace(/&/g,"&")
              .replace(/< /g,"&lt;")
              .replace(/>/g,"&gt;")
              .replace(/"/g,"&quot;")
              .replace(/'/g,"&apos;");
}
           

對replace的第一次調用傳回一個将所有特殊字元"&"替換為HTML字元串的轉義序列“&”的字元串;以此類推。這種重複的方法調用風格叫做方法鍊。這種風格不需要儲存中間結果為變量,更簡潔。jquery就是一個很好的例子。

function escapeBasicHTML(str){
    var str2=str.replace(/&/g,"&amp;")
    var str3=str2.replace(/< /g,"&lt;")
    var str4=str3.replace(/>/g,"&gt;")
    var str5=str4.replace(/"/g,"&quot;")
    var str6=str5.replace(/'/g,"&apos;");
    return str6;
}
           

消除臨時變量使代碼變得更加可讀,中間結果隻是得到最終結果中的一個重要的步驟而已。

如果一個API産生了一個接口對象,調用這個接口對象的方法産生的對象如果具有相同的接口,那麼就可以使用方法鍊。如前面50條和51條中描述的數組疊代方法就是另一個鍊式API。

var users=records.map(function(record){
    return record.username;
})
.filter(function(username){
    return !!username;
})
.map(function(username){
    return username.toLowerCase();
});
           

因為數組的每一種疊代方法,傳回得都是一個數組。可以友善地再使用數組方法進行處理。

這種風格非常靈活,并且對于API的使用者富有表現力,是以将API設計為支援這種風格是值得的。

通常情況下,

無狀态的API中,如果API不修改對象,而是傳回一個新對象,則鍊式得到了自然的結果。是以,API的方法提供了更多相似方法集的對象。

有狀态的API中,這裡的技巧是方法在更新對象時傳回this,而不是undefined。這使得通過鍊式方法調用的序列來對同一個對象執行多次更新成為可能。

element.setBackgroundColor('yellow')
       .setColor('red')
       .setFontWeight('bold');
           

有狀态的API的方法有時被稱為流暢式。如果更新方法沒傳回this,那麼API的調用者不得不每次重複該對象的名稱。如果該對象被簡單命名為一個變量,這沒有什麼差別。但當結合無狀态的方法用于檢索更新的對象,方法鍊非常簡潔,并且代碼更可讀。jquery中的方法普遍采用這種方法。它有一組(無狀态的)方法用于從使用者界面元素中查詢網頁,還有一組(有狀态的)方法用于更新這些元素。

$('#notification')
   .html('Server not responding.')
   .removeClass('info')
   .addClass('error');
           

通過調用有狀态的html,removeClass,addClass方法而傳回相同對象來支援流暢式,不用建立臨時變量存儲jQuery函數執行查詢的結果。如果覺得這種風格不太習慣,也可以添加中間變量來存儲各函數的傳回值。

var element=$('#notification');
element.html('Server not responding.');
element.removeClass('info');
element.addClass('error');
           

通過支援方法鍊,API允許程式員按自己的喜好選擇風格。如果方法傳回undefined,使用者會被強迫使用更啰嗦的風格。

提示

  • 使用方法鍊來連接配接無狀态的操作
  • 通過在無狀态的方法中傳回新對象來支援方法鍊
  • 通過在有狀态的方法中傳回this來支援方法鍊

版權聲明

翻譯的文章,版權歸原作者所有,隻用于交流與學習的目的。

原創文章,版權歸作者所有,非商業轉載請注明出處,并保留原文的完整連結。

繼續閱讀