2012-12-06 2 views
1

비슷한 기능을 가진 모듈을 만드는 동안 내가 놓칠 수있는 것을 배우기 위해 Node.js 모듈을 파고 들었습니다. 그럼 난 Hound에서이 코드를 건너 온 :Node.js의 기이 한 상속

function Hound() { 
    //why this? 
    events.EventEmitter.call(this) 
} 

//ok, so inheriting the EventEmitter 
util.inherits(Hound, events.EventEmitter); 

나는 Node.js를에서 util.inherits() 기능이 자식 생성자 as stated in the docs의 프로토 타입으로 새로운 부모 인스턴스를 생성 알고 : 생성자의

프로토 타입 superConstructor에서 생성 된 새 객체로 설정됩니다.

우리 생성자가 EventEmitter에서 util.inherits()을 상속하는 경우 생성자의 해당 코드는 무엇입니까?

+0

은 나에게 나쁜 코드처럼 보입니다. –

+0

수시로 이런 유형의 것을 보았습니다. 나는 항상 생성되는 인스턴스에서 슈퍼 생성자를 명시 적으로 호출해야한다고 생각했습니다. 문서에서 발췌 한 것을 감안할 때 필자는 그것이 필요한지 아닌지 확실하지 않다. '계승자 '가 다르게 일했을 때부터 남겨둔 오래된 컨벤션일까요? – chesles

+0

나쁜 코드는 아닙니다. JavaScript는 다른 언어의 모든 상속을 잘 나타내지 않습니다. 이것은 단순히 node.js가 EventEmitter 클래스로 작업하기를 기대하는 방법입니다. –

답변

1

그냥 Hound 클래스를 EventEmitter 개체로 만듭니다.

귀하의 클래스에 EventEmitter instance methods을 제공합니다.

예를 들어, 다음 그들에게 응답 할 수있는이 사건을 듣고 houndInstance.emit('something')

다른 목적. 귀하의 코멘트 당


: 자바 스크립트에서

// constructor 
function Hound() { 

    // equivalent of calling a "super" or "parent" constructor 
    SomeClass.call(this); 
} 

, .call(context)은 특정 컨텍스트에서 함수를 호출하는 수단이다. 위의 예제에서는 SomeClass 생성자를 호출하고 this (이 예에서는 Hound 클래스)을 컨텍스트로 전달합니다. 귀하의 의견에서

+0

'util.inherits()'는 이미 그것을 다루지 않았습니까? 또는 나는 무엇인가 놓치고 있냐? – Joseph

+0

제 편집을 참조하십시오. –

1

:

그러나 util.inherits()가 이미 적용되지 않습니다? 또는 나는 무엇인가 놓치고 있냐?

누락 된 부분은 util.inherits()은 상위 개체를 단순히 상속한다는 것입니다. 부모 객체의 생성자를 자동으로 호출하도록 생성자를 설정하지 않습니다. 대부분의 경우 대부분의 객체가 생성자에서 많은 초기화 작업을 수행하지 않으므로 대부분 충분합니다.

그러나 events.EventEmitter은 분명히 몇 가지 중요한 부작용이있는 생성자에서 초기화를 수행합니다. 프로토 타입 상속은 부모 생성자를 자동으로 호출하지 않으므로이 경우 수동으로 호출해야합니다. 따라서 events.EventEmitter.call(this) 행.


대체로 부모 생성자를 호출하는 모듈 패턴을 사용하는 것입니다. 이는 모듈 패턴이 se마다 상속이 아니기 때문에 믹스/데코레이터 패턴을 악용하여 상속을 에뮬레이션합니다. 부모 생성자에서 객체를 만들고 수동으로 속성을 추가하기 때문입니다. 많은 사람들이 함수와 attrubutes를 복제하기 때문에 모듈 패턴을 좋아하지 않습니다 - 따라서 그들은 메모리를 낭비하는 것으로 봅니다. 또한 적절한 상속이 아니므로 instanceof과 같은 내용을 깨뜨릴 수 있습니다.