2014-10-04 2 views
4

Stoyan Stefanov의 Object oriented javascript 책을 읽고 있는데 완전히 혼란스러워합니다. 함수가 있다고 가정 해보십시오.무한 생성자에 갇혀 있습니다 .prototype.constructor.prototype chain

function Test(){ 
    this.greeting = 'hello'; 
} 

Test.prototype.farewell = "bye" 

test = new Test(); 

test.constructor; //returns Test() 

test.constructor.prototype; //returns {farewell:"bye"} 

test.constructor.prototype.constructor; //returns Test() 

이 책에는 프로토 타입이 객체이기 때문에 생성자가 있어야한다고 써 있습니다. 위의 예제에서 보듯이 프로토 타입의 생성자는 test의 생성자와 같습니다. ie Test()

예상 되나요?

이 책은 "잠시 동안 계속 될지도 모르겠지만 궁극적으로는 최고 수준의 부모 인 Object() 개체에 내장됩니다." 그러나 체인의 모든 생성자가 Test()을 반환하기 때문에 나는 무한 루프에 갇혀있는 것 같습니다. 어떻게 Object()에 도착할 수 있습니까?

아무도 정리할 수 있습니까? (나는이 체인이 유용한 이유를 모르겠습니다.)

+0

당신의 책이 말하는 사슬이 아닙니다. 방금 생성자와 그것의'.prototype' 사이의 순환 참조에 갇혀 있습니다. – Bergi

+0

책이 말하는 체인은 무엇입니까? – Lars

+0

"프로토 타입 체인", 즉 각 객체가 속성을 상속하는 다른 객체와 보이지 않는 링크에 대해 이야기하고 있다고 생각합니다. 예 : "test -> Test.prototype -> Object.prototype -> null' (여기서'->'은 그 링크입니다) – Bergi

답변

1

당신은 틀림없이 옳습니다. 프로토 타입 객체는 틀린 생성자를가집니다. 프로토 타입 객체를 프로토 타입으로 사용하지만 자체적으로 사용하지 않는 것이 옳기 때문입니다. 이는 프로토 타입이 그 점에서 일반적인 객체가 아니라는 것을 의미합니다. 클래스 객체와 같은 특별한 역할을합니다.

아직 알지 못했다면 이별은 고전적인 클래스의 정적 멤버와 같습니다. 객체마다 존재하는 변수가 아닙니다.

책에서 체인의 생성자 포인터를 따라갈 수 있다고 말하면 잘못된 것입니다. getPrototypeOf()를 따라 체인을 따라갈 수 있습니다. {여기에 잘못된 언더 - 아래 - 프로토 타입 물건을 편집}.

당신이 오리 타이핑의 멋진 자유를 가질 때 이것이 유용한 이유는 무엇입니까?

+0

밑줄이 밑줄 밑줄 밑줄 밑줄로 표시되었지만, 아래로 굵은 글씨로 축소되었습니다. –

+1

'\'__proto __ \''를 포맷팅에 사용할 수 있지만,'__proto__' 대신'Object.getPrototypeOf()'를 사용해야합니다. – Bergi

+0

좋은 지적이며 포맷 팁에 감사드립니다. –

관련 문제