프로토 타입을 생성 할 때 생성자를 사용하지 않는 이유는 무엇입니까?


10

빠른 배경 : JavaScript에서 각 객체 유형에 대한 생성자 함수에는 prototype속성이 있습니다. 이는 prototype생성 된 각 객체가 프로토 타입 체인에서 다음 단계로 사용하는 객체를 나타냅니다. 한 유형을 다른 유형에서 고유하게 prototype하려면 하위 유형을 상위 유형의 새 인스턴스로 설정할 수 있습니다 .

예를 들면 다음과 같습니다.

var Parent = function() { /* constructor business */ }
Parent.prototype.parentProp = "some parent property";

var Child = function() { /* constructor business */ }
Child.prototype = /*** !! Some prototype object goes here !! ***/

Some prototype object goes here위의 코드에서 " "자리 에 어떤 코드가 들어가야하는지에 대한 질문이 있습니다. 나의 첫 번째 본능은 부모 (즉, new Parent()) 의 인스턴스를 구성하는 것입니다. 한 사용자가 다음과 같이 씁니다.

아니요, new bar()프로토 타입 객체 에는 사용하지 마십시오 !

(... 이것은 많은 SO 답변과 의견에서 본 의견이지만 지금 당장 가지고있는 유일한 예입니다.)

다른 옵션은로 사용 Object.create(Parent.prototype)하는 것 Child.prototype입니다. 내가 아는 한, 이것은 또한 새로운 Parent인스턴스를 생성 하지만 Parent생성자를 실행하지는 않습니다 .

부모 유형에서 프로토 타입 객체를 생성 할 때 생성자 함수 실행을 피해야하는 이유를 누군가 설명 할 수 있습니까? 몇 가지 중요한 상속 문제가 있습니까? 또는 이러한 패턴이 프로토 타입 모범 사례와 충돌하는 생성자의 오용입니까 (예 : 프로토 타입을 만들 때 생성자를 실행하면 일부 우려가 위반 되는가)?

답변:


5

호출 할 필요가없는 함수이기 때문입니다. newJavascript의 일반 함수 호출과 다르지 않습니다.

생성자는 단순히 필드를 설정하는 것 이상을 수행 할 수 있습니다. 예를 들어 들어오는 데이터의 유효성을 검사하면 상속 체인을 설정하려고 할 때 유효성 검사 오류가 발생합니다.

그리고 당신은 필요하지 않습니다 Object.create, 이것으로 충분합니다 :

function objectCreate( proto ) {
    function T(){}
    T.prototype = proto;
    return new T();
}

그러나 이것이 정확히 Object.create구현되는 방식입니다.
Casey Chu

@CaseyChu 전혀 아닙니다. 그리고 링크 된 게시물에서 누군가가 " Object.createIE8에서 작동하지 않는다 "고 말했기 때문에 언급했습니다 .이 브라우저는이 사용 사례에 대해 2 초 안에 구현할 수있을 때 쓸모없는 의견입니다.
Esailija

2

이해가 조금 넓어 졌으므로 Esailija의 답변 을 구체적인 예를 들어 작성 하고 싶습니다 .

특정 관심사는 생성자가 인스턴스 별 특성을 설정할 수 있다는 것입니다. 따라서로 생성 된 프로토 타입 객체를 사용하면 new모든 자식 인스턴스가 프로토 타입에서 단일 생성자 정의 인스턴스 별 속성을 공유 할 수 있습니다.

예를 들어 Parent인스턴스마다 id생성 시간으로 고유 한 속성이 설정되어 있다고 가정 합니다 .

var Parent = function() { this.id = Math.random(); }
Parent.prototype.parentProp = "some parent property";

var Child = function() { /* constructor business */ }
Child.prototype = new Parent();

이로 인해 모든 Child 인스턴스는로 사용 된 id유일한 new Parent()개체 에서 상속 된 단일 프로토 타입 속성 을 공유하게 됩니다 Child.prototype.

이 경우 더 좋은 방법 Object.create은 자식 생성자 내에서 부모 생성자 (필요한 경우)를 사용 하고 직접 호출하는 것입니다.

var Parent = function() { this.id = Math.random(); }
Parent.prototype.parentProp = "some parent property";

var Child = function() {
    // run `this` through the Parent constructor function
    Parent.apply(this, arguments);
}
Child.prototype = Object.create(Parent.prototype);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.