2011-10-07 6 views
2
(function() { 
    window.gArr = new ExtArray(); 
})(); 

function ExtArray() { 
    this.bounce = function() { 
     document.write("Bounced successfully!"); 
    }; 
} 

ExtArray.prototype = new Array; 
ExtArray.prototype.first = function() { 
    document.write(this[0]); 
} 

var eArr = new ExtArray(); 
//all three work 
eArr.bounce(); 
eArr.push("I am first! "); 
eArr.first(); 
// invoking global 
gArr.bounce(); // it works 
gArr.push("No, it is me who is really first! "); // doesn't work 
gArr.first(); // doesn't work 

왜 작동하지 않습니까?인스턴스 메서드가 예상대로 작동하지 않는 이유는 무엇입니까?

+0

관찰 된 행동은 무엇입니까? 예상되는 행동은 무엇입니까? 그들은 어떻게 다른가요? –

+0

gArr.push가 작동하고 gArr.first()가 "아니요, 실제로 누가 먼저 저입니까?" – DrStrangeLove

+0

"생성자 함수의 프로토 타입은 언제든지 변경할 수 있습니다. 영역을 다시 할당하면 rect의 새로운 인스턴스는 처음 몇 인스턴스와 다른 영역 메소드를 가지게 될 것입니다. 프로토 타입을 변경해도 생성 된 객체의 인스턴스에는 영향을 미치지 않습니다. " 참조 : http://xhalent.wordpress.com/2011/02/16/javascript-object-instantiation-and-prototypes/ –

답변

1
> (function() { 
>  window.gArr = new ExtArray(); })(); 

왜 것이 바람직하다 단지 (제가 실패하는 경우에는 윈도우 오브젝트가 존재하지 않는 경우)

var gArr = new ExtArray(); 

들은 기능적으로 동일하다; 페이지 로딩 먼저 전체 문서를 삭제합니다 완료 (즉, HTML 태그 사이에있는 모든)와 (이 경우 함수에 전달되는대로 쓰기 후 document.write를 를 사용

> function ExtArray() { 
>  this.bounce = function() { 
>   document.write("Bounced successfully!"); 
>  }; } 

, 두 단어 문자열).

> ExtArray.prototype = new Array; 
> ExtArray.prototype.first = function() { 
>  document.write(this[0]); 
> } 

는 위와 document.write를은 파괴적이다.

> var eArr = new ExtArray(); 
> //all three work 
> eArr.bounce(); 
> eArr.push("I am first! "); 
> eArr.first(); 

아마도 이것은로드 이벤트 전에 실행 중일 것입니다. "작동하지 않습니다"당신이 ExtArray.prototype를 수정하기 전에 GARR을 초기화하기 때문에 것을

> // invoking global 
> gArr.bounce(); // it works 
> gArr.push("No, it is me who is really first! "); // doesn't work 
> gArr.first(); // doesn't work 

비트는 반송 인스턴스 메소드가 여전히 기본 프로토 타입을 가지도록 할 때 생성자 선언되었다.

선언이 완료되면, 코드가 순차적으로 실행 기억 때문에 GARR = 새로운 ExtArray() ExtArray.prototype = 새 Array 이전 실행; 등등.

또한, 인스턴스는 생성과 가 (모질라되지 프로토 속성 제외) 이후을 변경할 수없는 순간에있어서의 생성자의 프로토 타입을 참조하는 내부 프로토 타입 속성이 있습니다. 따라서 컨스트럭터의 프로토 타입을 변경해도 이미 생성 된 인스턴스의 내부 프로토 타입은 변경되지 않습니다.

1

당신이 ExtArray.prototype를 정의 후에는 window.gArr을 정의해야합니다 :

function ExtArray() { 
    this.bounce = function() { 
     document.write("Bounced successfully!"); 
    }; 
} 

ExtArray.prototype = new Array; 
ExtArray.prototype.first = function() { 
    document.write(this[0]); 
}; // <-- semicolon will be REQUIRED here. 

(function() { 
    window.gArr = new ExtArray(); 
})(); 

DEMO :http://jsfiddle.net/Vg3Ze/

+0

http://jsbin.com/ewamuh/edit 시도했습니다. undefined가 반환됩니다. :( – DrStrangeLove

+1

ExtArray.prototype을 정의한 후에';'를 잊어 버렸습니다.먼저 – lostyzd

+0

@DrStrangeLove : lostyzd가 맞습니다. 이것은 세미콜론이 중요한 장소가 될 것입니다. 그렇지 않으면 즉시'ExtArray.prototype.first'를 * 호출합니다. – user113716

관련 문제