2011-12-06 3 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 

잠시 후 나는 배열 인수를 할당하여이 문제를 해결했습니다.자바 스크립트 : 추가 적용 처리로 인수가 변경됨

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

나는 인수가 결국 배열이 아니거나 세미 어레이 인 것을 알았습니다. 음, 푸시 방법이 없습니다.

이유는 무엇입니까 (내 뜻은 정의되지 않음)? 그것은 어떤 목적을 위해 만들어졌습니다.

답변

2

당신은 이미 arguments이 배열이 아니라 "배열 형"이라는 것을 보았습니다.

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

어떤 식 으로든 작업을 수행

arguments object

귀하의 코드 : 그것은 숫자 키가 보통의 객체와 length 속성입니다.

그러나 배열이 아니기 때문에 length 속성은 업데이트되지 않습니다. 내가 apply의 구현을 모르는 지금

arguments length 0

하지만 나는 그것이 "배열"의 모든 요소를 ​​반복하는 length 속성을 사용하여 가정 : 당신이 속성을 추가하지만, 그래서, length 여전히 0입니다 . length가 0이면 함수에 인수를 전달하지 않으므로 o은 실제로 undefined입니다.

당신이

arguments.length = 1; 

를 추가하는 경우 다음 works as you expected.

arguments에 배열을 지정하면 해당 객체를 덮어 쓰고 배열에 요소를 할당하는 것은 알려진대로 length을 업데이트합니다.

관련 문제