2017-09-05 7 views
0

필자는 JavaScript의 프로토 타입 상속을 잘 이해하고 있지만 완벽하다고 말하지는 않습니다. 나는 자바 스크립트 상속을위한 최신 prototypal 문법을보고 있으며, 지금까지 꽤 좋은 의미가있다.JavaScript ES5 프로토 타입 상속에서 대리 클래스가 필요한 이유는 무엇입니까?

__proto__은 상위 기능의 prototype을 조회하는 데 사용됩니다. CatMammal이 있다고 가정하면 Cat.prototype.__proto__Mammal.prototype으로 간단하게 지정할 수 있습니다.

가 최근까지 표준화되지 않았기 때문에 __proto__의 사용은 권장하지되었다
ChildClass.prototype.__proto__ = ParentClass.prototype; 
ChildClass.prototype.constructor = ChildClass; 

. 따라서, 현대 표준화 된 방법은 ChildClass에의 프로토 타입을 수정하는 것도 수정하기 때문에,

ChildClass.prototype = ParentClass.prototype; 

나쁜 지금 Object.create

ChildClass.prototype = Object.create(ParentClass.prototype); 
ChildClass.prototype.constructor = ChildClass; 

를 사용의이 ES5의 대리 접근 분명히

function Surrogate() {}; 
Surrogate.prototype = ParentClass.prototype; 
ChildClass.prototype = new Surrogate(); 
ChildClass.prototype.constructor = ChildClass; 

살펴 보자하는 것입니다 ParentClass의 프로토 타입입니다.

하지만 왜 우리가 이것을 할 수 없습니까?

ChildClass.prototype = new ParentClass(); 

왜 사이에 대리 물이 필요합니까?

+2

개인적으로 나는 'ES5의 대리 접근법'이 완전히 정확하지 않다고 말하고 싶습니다. 2011 년에는'Object.create'가'5.1'에 추가되었으므로 현대 JS까지는 매우 오랜 시간이 걸렸습니다. – loganfsmyth

+0

'new'가 사용되었습니다 * before * ES5는'Object.create'를 도입했습니다. – Bergi

답변

1

하지만 왜이 작업을 수행 할 수 없습니까?

ChildClass.prototype = new ParentClass();

당신은 어떻게 오류가 발생하지 않을/인수 O를 승 ParentClass 생성자를 호출 있음을 알 수 있습니까?

ParentClass이 이런 방식으로 구현되었다고 상상해보십시오.

+0

아, 감사합니다. 이것이 대리 클래스를하는 유일한 이유입니까? 내가 알아야 할 다른 숨겨진주의 사항이 있습니까? 대리 트릭이 잡히도록 설계 되었습니까? – cfeng

+0

@cfeng 다른 부작용 인'ParentClass'도 할 수 있습니다. 예를 들어 외부 API, 증분 카운터 등을 호출 할 수 있습니다. –

+1

@cfeng 생성자를 전혀 호출하지 않으려합니다. 무엇이 초기화되어야합니까? 주변에 인스턴스가 없습니다. – Bergi