2012-11-06 9 views

Trả lời

22

Hai đang dự định được tương đương. Để báo giá thay đổi Backbone.js:

0.3.0: Lớp xương sống giờ đây có thể được kế thừa liền mạch bởi các lớp CoffeeScript.

Cả hai của Child extends Parent CoffeeScript và Backbone của Child = Parent.extend() làm ba điều quan trọng:

  1. (quan trọng nhất) Họ đặt Child.prototype để new ctor, nơi ctor là một chức năng mà nguyên mẫu là Parent.prototype. Điều đó thiết lập sự thừa kế nguyên mẫu.
  2. Chúng sao chép tất cả các thuộc tính tĩnh của Parent vào Child.
  3. Họ đặt Child.__super__ = Parent. Điều này chủ yếu để hỗ trợ các từ khóa giống như Ruby super của CoffeeScript trong các phương thức của Child.
2

Có một số khác biệt. Nếu bạn sử dụng phương thức extend() của Backbone, bạn sẽ bị mất trên đường cú pháp lớp của CoffeeScript như super và các thuộc tính/phương thức tĩnh.

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

mà biên dịch để (không chính xác) ...

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

Bạn có thể sử dụng siêu cách này mặc dù:

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

mà biên dịch để (đúng) ...

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

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

Hạn chế đối với các lớp học coffeescript, dependi Về cách bạn tổ chức và biên dịch mã của bạn, mỗi lớp có thể có chức năng __extends() của CoffeeScript được thêm vào phần đầu của định nghĩa lớp trong javascript được biên dịch. Điều này bit thêm mã trùng lặp hàng chục lần có thể đáng kể bóng các tập tin của bạn. Đặc biệt đúng nếu sử dụng một khuôn khổ bao bọc mã của bạn trong các mô-đun common.js.

Vì vậy, tôi sẽ sử dụng Backbone's extend() theo mặc định cho mã được biên dịch gọn gàng. Sau đó, khi bạn có một trường hợp đặc biệt mà sẽ là tốt đẹp để sử dụng cú pháp lớp coffeescript, sau đó đi trước và sử dụng nó ... sparingly.

+1

CoffeeScript tối ưu hóa mã khi biên dịch mã, mặc dù tệp kết quả có thể có nhiều ký tự hơn một chút sẽ không sử dụng lớp 'Coffee' thường thực thi hiệu quả hơn? – rudolph9