2011-12-06 5 views
2
function Foo(){ 

    } 
    Foo.prototype={ 
     method1:function(o){ 
      console.log(o); 
     } 
     ,shorthand:function(){ 
      if(!arguments.length || typeof arguments[0]=='undefined') { 
       arguments[0]={}; 
      } 
      arguments[0].bar='test'; 
      return this.method1.apply(this,arguments); 
     } 
    } 

    var instance=new Foo(); 
    instance.shorthand(); 

console.log(o); // returns undefined 

しばらくして、引数を割り当てることによって配列が修正されたことがわかりました。Javascript:さらなる適用処理で引数が変更される

arguments=[{bar:'test'}]; 

私は、その引数は配列、またはセミ配列ではありません。プッシュメソッドはありません。

なぜそうしているのですか(私は意味がありません)?何らかの目的のために作られたのですか?

答えて

2

すでにargumentsは配列ではなく「配列のような」ものであることがわかりました。これは、数字キーやlengthプロパティを持つ通常のオブジェクトである:

arguments object

あなたのコード

arguments[0]={}; 
arguments[0].bar='test'; 

は、何らかの方法で作業を行います。

ただし、配列ではないため、lengthプロパティは更新されません。あなたがプロパティを追加したもののので、lengthはまだ0です:

arguments length 0

、私はapplyの実装を知らないが、私はそれが「アレイ」内のすべての要素を反復処理するlengthプロパティを使用していますと仮定。 lengthが0の場合、関数に引数を渡さないので、oは実際にはundefinedです。

あなたは

arguments.length = 1; 

を追加する場合、それworks as you expected

argumentsに配列を割り当てると、オブジェクトが上書きされ、アレイに要素を割り当てることは、既知のとおり、lengthを更新します。

関連する問題