underscore.jsソースコードの読み取り(2)

  今日は次のアンダースコアrestArgs機能と関数createAssignerを見ました

1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

//(http://ariya.ofilabs.com/2013/03/es6-and-rest-parameter.html)
//これは、指定されたインデックスの後、配列に渡される引数を蓄積する。
//休息とES6同様の特性は、所定のパラメータのインデックス位置に応じて、パラメータは、インデックスの後の位置まで充填される
//(参照https://github.com/jashkenas/underscore/issues/2542)VaRの restArgs = 関数FUNC、startIndexの { == = startIndexのstartIndexのヌル func.length - ?1:+のstartIndex; リターン機能


{ VARの長さ= 数学 .MAX(引数 .LENGTH - startIndexの、0)、 残り= 配列(長さ)、 インデックス= 0(;指数<長さ;インデックス++){ 残り[インデックス] = 引数 [索引+のstartIndex]。 } スイッチ(のstartIndex){ ケース0リターン func.call(この、REST)。ケース1戻り func.call(この引数 [ 0 ]、REST)。









ケース 2リターン func.call(この引数 [ 0 ]、引数 [ 1 ]、REST)。
} VARの引数= 配列(のstartIndex + 1)。(インデックス= 0、インデックス<startIndexの、インデックス++){ 引数[インデックス]は、= 引数 [インデックス]を、 } 引数[startIndexの] =休止; 返す func.apply(この、引数); }。 }。








  createAssignerこの関数は、主に以下の三つの分野で使用されます。

1 
2
3
4
5
6
7
8
9
 //渡されたオブジェクト(複数可)内のすべてのプロパティで指定されたオブジェクトを拡張します。_ .extend = createAssigner(_ .allKeys)。


//は、渡されたオブジェクト(複数可)内のすべての独自のプロパティを持つ指定されたオブジェクトを割り当て。//(https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)_ .extendOwn = _ .ASSIGN = createAssigner(_ .keys)。//デフォルトプロパティを持つ指定されたオブジェクトに入力します。_ .defaults = createAssigner(_、.allKeys )。





   _.extend機能拡張機能は、オブジェクトの属性を乾燥させるために使用され、_.extendOwnオブジェクトの機能は、独自の属性を持っています。_.defaults機能があり、同じキーならば、後者は以前に上書きしません、最初の値をとるためのキーは、キーとして、一度表示されます-値のペア。
  また、大型の列は、  ソースを読み取るunderscore.js(2) > =パラメーターは、例を.extendするが、.extend(A、B、C)は、Bされ、二つcを受け入れることができる3つの方法へのキーオブジェクトをカバーします。

1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//割当機能を作成するための内部機能 。 
ディスペンサ機能//実現するための内部機能するvar createAssigner = 関数keysFunc、デフォルト { //復帰機能//古典的な閉鎖を(デフォルトパラメータは、関数リターンで参照されています)> = 1の関数のパラメータの数を返す// へのオブジェクトの第2のキーパラメータを開始//第1のパラメータを「継承」を返す関数OBJ { VARの長さ= 引数が .LENGTH; //のみ一つのパラメータ(?または0)を渡す//または最初の引数はNULLであるIF(デフォルト)OBJ = オブジェクト(OBJ)IF(長さ< 2 || OBJ == NULL戻り OBJ。











第1のパラメータオブジェクトパラメータ以外//列挙//すなわち引数、引数[2] ... [1] のためのVARのインデックス= 1、インデックス<長さ;インデックス++){ VARのソース= 引数 [インデックス]、/パラメータキーの/抽出対象値// keysFuncパラメータは_.keys示し//または_.allKeysの 、キー= keysFunc(ソース) L = keys.length; //キーは、オブジェクトを横断するためのVAR I = 0。私はLを<;私は++){ VARのキー=キー[I]は、// _.extend方法と_.extendOwnを//デフォルトパラメータがtrueにデフォルトとして、すなわち、渡されていません!//すなわち、確かに行っOBJ [キー] =ソース[キー] //直接オブジェクトobjカバーの背後にあるキー















========================================== // // _.defaults方法、trueにデフォルトパラメータ//つまり!デフォルトのfalseに//場合に限り、OBJ [キー]は未定義のときカバレッジ//すなわち、もし同じキー値、方の値早いの値// _.defaultsで同じキーが最初の出現とされるIF(デフォルト|| OBJ [キー] ===!空隙0、OBJ [キー] =出典[キー]) } } 戻り、第1のオブジェクトのパラメータの後ろにプロパティを継承している//パラメータオブジェクト戻り OBJ; }; };












おすすめ

転載: www.cnblogs.com/dajunjun/p/11711028.html