2016-11-03 1 views
1

라이브러리의 복잡한 기능에 대한 mixin을 만들려고합니다.Object.assign이 Function.prototype과 작동하지 않는 것 같습니다.

const proto = Object.create(Function.prototype); 

을하지만 지금은 물체가 기능 프로토 타입 및 프로토 타입 터 경우 모두 상속과 같은 몇 가지 다중 상속을 할 필요가, 그래서 나는이 작업을 수행 할 수 :

이 나를 위해 일하는

const EE = require('events'); 

const proto = Object.create(Object.assign({}, EE.prototype, Function.prototype)); 

그러나 예상대로 작동하지 않았습니다.

그래서 나는 시도 그냥이 :

const proto = Object.assign({}, Function.prototype); 

하고이 같이 Function.prototype이 복사되지 않은 어떤 이유로, 내 관찰이 정확하다는 것을 보여 주었다? 왜 이럴 수 있니?

+0

Function.prototype은 "호스트 객체"로 간주됩니다. 그래서 브라우저는 그것을 다르게 취급합니다. – vothaison

+1

@vothaison - 왜 Function.prototype이 호스트 객체라고 생각합니까? 그것은 언어가 아니라 환경의 일부입니다. – jfriend00

+0

ftm, 브라우저가 아닌 node.js에 대해서만 말하기 –

답변

4

19.2.4.3 of the ES6 spec마다 Function.prototype의 속성은 열거되지 않으며 Object.assign()은 열거 가능한 속성 만 복사합니다. 그 이유는 Object.assign()이 열거되지 않는 속성을 보지 않았고 복사하지 않았기 때문에 복사본이 비어있는 이유입니다.

속성을 복사하려면 다른 속성으로 속성을 가져와야합니다. Object.create()은 그것이 설계된 이후로 아마 최선의 방법 일 것입니다.

0

@ jrfiend00이 아마도 맞을 것입니다. 그것은 내가하고 싶은 일을 성취 할 수있는 것처럼 보입니다.

const $proto = Object.create(Function.prototype); 
const proto = Object.assign($proto, EE.prototype); 

2 단계 믹스 인.

const proto = Object.assign({}, EE.prototype, Function.prototype); 

을하지만 지정된 이유 jfriend00 가장 가능성이 작동하지 않습니다

일반적으로, 나는이 작업을 수행 할 수 있기를 기대합니다. 왜 사양이 Object.create가이 작업을 할 수 있는지는 확실하지 않습니다.

+0

'Object.create()'는 프로토 타입에 열거되지 않는 속성을 처리하도록 제작되었습니다. 이것은 좋은 방법 인 것처럼 보입니다. – jfriend00

+0

나중에이 오류가 내 프로그램에서 발생합니다.> "TypeError : proto.once()를 호출 한 후 읽을 수없는 속성 '_events'"가 무엇인지 확실하지 않습니다. –

+0

_events는 EventEmitter에서 가져 왔습니다. 나는 그것을 알아 냈다. 나는 읽기 전용으로 속성을 고정시키고있다. 위의 방법론과 아무런 관련이 없다. 무시해라. :) –

관련 문제