2012-11-06 2 views

답변

22

두에서 동등한 것으로 의도된다

class User extends Backbone.Model 

다르다.

0.3.0 : 백본 클래스는 이제 완벽하게 커피 스크립트 클래스에 의해 상속 될 수 Backbone.js 변경 로그를 인용합니다.

두 커피 스크립트의 Child extends Parent 및 백본의 Child = Parent.extend()는 세 가지 중요한 일을 :

  1. (가장 중요한) 그들은 ctor 프로토 타입 Parent.prototype을하는 기능입니다 new ctorChild.prototype을 설정합니다. 그것은 프로토 타입 상속을 수립합니다.
  2. Parent의 정적 속성을 모두 Child에 복사합니다.
  3. Child.__super__ = Parent을 설정합니다. 이것은 주로 Child의 방법에 CoffeeScript의 Ruby와 같은 super 키워드를 지원하기위한 것입니다.
2

약간의 차이가 있습니다. 백본의 extend() 방법을 사용하면 super 및 정적 속성/메소드와 같은 CoffeeScript 클래스 구문 설탕을 잃게됩니다. (잘못된)로 컴파일

Model = Backbone.Model.extend 
    set: (attrs, options) -> 
    super 

...

var Model; 
Model = Backbone.Model.extend({ 
    set: function(attrs, options) { 
    return set.__super__.constructor.call(this, arguments); 
    } 
}); 

당신은 비록 슈퍼이 방법을 사용할 수 있습니다 (올바른)로 컴파일

Model = Bakbone.Model.extend() 
Model::set = -> 
    super 

...

var Model; 
Model = Backbone.Model.extend(); 

Model.prototype.set = function() { 
    return Model.__super__.set.apply(this, arguments); 
}; 

coffeescript 클래스의 단점 인 dependi 코드를 구성하고 컴파일하는 방법에 대해 각 클래스는 컴파일 된 자바 스크립트의 클래스 정의 맨 위에 CoffeeScript의 __extends() 함수를 추가 할 수 있습니다. 수십 번 복제 된이 여분의 코드는 파일을 크게 팽창시킬 수 있습니다. common.js 모듈에서 코드를 래핑하는 프레임 워크를 사용하는 경우 특히 그렇습니다.

그래서 백본의 extend()은 기본적으로 마른 컴파일 된 코드로 사용됩니다. 그런 다음 coffeescript 클래스 구문을 사용하는 것이 좋을 특별한 경우가 있으면 사용하십시오. 아껴서.

+1

CoffeeScript는 컴파일 할 때 코드를 최적화합니다. 결과 파일은 CoffeeScript를 사용하지 않는 문자가 약간 더 많을 수 있지만 일반적으로 'class'는 일반적으로 더 효율적으로 실행됩니까? – rudolph9