19775


**リンク先の「クラスの継承」に、下記記述があるのですが、どういう意味でしょうか？**

・extend関数へ渡されたoオブジェクト引数の数だけループを回した上に、oオブジェクト引数の各内容毎に(？)ループを回して、生成したインスタンスのプロパティとして設定する？

[code]

    /**
     * Object.createの拡張関数
     */
    function extend(o) {
      var f = extend.f, i, len, n, prop;
    
[/code]

//中略

[code]

      for (i=1, len=arguments.length; i<len; ++i) {
        for (prop in arguments[i]) {
          n[prop] = arguments[i][prop];
        }
      }
    
[/code]

<http://qiita.com/Hiraku/items/16e88b999bd82d86aa66>


CC BY-SA 3.0
2015-12-08T00:23:03.130
19741
2015-12-09T09:37:09.473
2015-12-08T04:46:05.883
8000
7886
question
javascript
このコードの for (i=1, len=arguments.length; i<len; ++i) はどういう意味？


  * 言葉足らずだったので少し修正致しました。

**arguments** と言うのは **function** に渡された引数が格納される  
ローカルの配列のようなもの(※似ているけど配列と同じではない)です。  
functionを呼び出す時にextend(o,p,q,…)と引数が入力された場合にo以外は  
変数の割当が記述されていないけどp,q,…に該当する引数も取り出す事が出来ます。

質問文のjavascriptは **extend** に与えられた引数を全て取り出しています。

> 第1引数 = function extend( **o** ) で記述された **o** (arguments[0]と同等)  
>  第2引数 = **arguments[1]**  
>  第3引数 = **arguments[2]**  
>  第n引数 = **arguments[n-1]**

外側のfor句の開始が **i=1** なのでfor文で第2引数( **arguments[1]** )以降の引数を順番に処理しています。

[code]

    for (i=1, len=arguments.length; i<len; ++i) {
    
[/code]

内側の **for～in** は対象の引数の列挙可能プロパティ( **prop** )を取得して  
順番に **n** に格納していくというものです。

[code]

    for (prop in arguments[i]) {
      n[prop] = arguments[i][prop];
    }
    
[/code]

**n** はループの外で宣言されたオブジェクトなので  
n[prop] = ～とすると後から来た引数の中に  
同じプロパティ名があった場合は上書きされます。

尚、質問文に抜粋された部分では **o** は使用していません。  
**o** には第1引数が入っており、arguments[0]と同等ですが、  
ループ部分は第2引数(arguments[1])以降を処理しています。


CC BY-SA 3.0
2015-12-09T00:49:58.090
19775
2015-12-09T09:37:09.473
2015-12-09T09:37:09.473
9262
9262
19741
answer