2012-10-11 5 views
3

mixins를 사용하여 큰 클래스를 분할하고 싶습니다.Coffeescript에서 mixins 사용

내가

@include: (obj) -> 
    for key, value of obj when key not in moduleKeywords 
     # Assign properties to the prototype 
     @::[key] = value 

    obj.included?.apply(@) 
    this 

class FooMixin 

    b: => @something = 2 

class Foo extends Module 
    @include FooMixin 

    a: => @something = 1 

문제 Little Book

에서이 믹스 인 코드를 사용하고는 FooMixin에서 @FooMixin 것입니다. 대신 Foo이되고 싶습니다.

@include() 끝에 _.bind(@::[key], @) 줄을 추가하려고했지만 도움이되지 않습니다. 어떤 제안?

답변

3

좋아, 내가 잘못하고있는 것 몇 가지. 작은 책에서

@include

1.

하지 클래스를 객체 걸립니다. 클래스로 작업하려면 @include FooMixin::을 작성해야합니다. 그러나, 나는 그때부터 사물을 사용하기 시작했다.

2.

객체 대신 클래스를 사용하여, 굵은 화살표는 오른쪽 _this = this를 판독하는 상단의 커피 스크립트 랩퍼의 내부 선을 추가한다. 모든 메서드는 우리가 원하는 것이 아닌 전역 컨텍스트에 바인딩됩니다. 수정하려면 굵은 화살표를 얇은 화살표로 변환하고 각 기능을 Foo 인스턴스에 바인딩해야합니다.
constructor: -> 
    for fname in _.functions FooMixin 
    @[fname] = _.bind @[fname], @ 
    super 

내가 _.bindAll @, _.functions FooMixin을 시도하지만, 위의 코드를 꽤 많이와 동일한 _.bindAll 방법 그대로보고, At Function.bind, could not run bind of undefined. 이상한 오류 같은 말을 나에게 오류를 준 : 밑줄을 사용하여 나는 Foo의 생성자이 추가되었습니다.

이제는 더 나은 가독성과 코드 공유를 위해 클래스를 나눌 수 있습니다.


UPDATE : _.bindAll의 문제점은 그것이 플랫하지 어레이를 취한다는 것이다. 수정은 _.bindAll @, _.functions(FooMixin)...입니다.

업데이트 : 더 나은 해결책을 찾았습니다.

원본 게시물과 동일합니다. mixins에 클래스를 사용하십시오.

@include FooMixin::을 사용하거나 @include을 변경하여 속성 대신 프로토 타입을 조작하십시오.

Foo 생성자에서 메서드를 올바르게 바인딩하는 FooMixin.call @을 작성합니다.

이것은 잘 작동하며 멋지고 깨끗합니다.

유일한 잠재적 인 문제는 mixins가 기존 속성에 의해 무시된다는 것입니다.내가 볼 수있는이 문제를 얻을 수있는 유일한 방법은 같은 것을 할 수 있습니다 :

after = -> 
    _.extend Foo, FooMixin:: 

class Foo 
    # define... 

after() 

을 또는 _.defer에 확장 방법을 전달하지만이 너무 해키 아마 작동하지 않습니다.

+0

backbone.js (또는 underscore.js)를 사용하고있는 사람에게 한 가지 더주의해야 할 점은 모델에 이미 정의 된 ['extend'] (http://backbonejs.org/#Model-extend) 메서드가 있다는 것입니다 여기에 설명 된 것과 충돌합니다. 모든 종류의 문제가 발생했다면 다른 이름으로 바꾸십시오. –

관련 문제