Các lớp và phương thức tĩnh trong coffeescript


86

Tôi muốn viết một lớp trợ giúp tĩnh trong coffeescript. Điều này có khả thi không?

lớp học:

class Box2DUtility

  constructor: () ->

  drawWorld: (world, context) ->

sử dụng:

Box2DUtility.drawWorld(w,c);

Câu trả lời:


179

Bạn có thể xác định các phương thức của lớp bằng cách đặt tiền tố chúng bằng @:

class Box2DUtility
  constructor: () ->
  @drawWorld: (world, context) -> alert 'World drawn!'

# And then draw your world...
Box2DUtility.drawWorld()

Demo: http://jsfiddle.net/ambiguous/5yPh7/

Và nếu bạn muốn mình drawWorldhoạt động như một hàm tạo thì bạn có thể nói new @như thế này:

class Box2DUtility
  constructor: (s) -> @s = s
  m: () -> alert "instance method called: #{@s}"
  @drawWorld: (s) -> new @ s

Box2DUtility.drawWorld('pancakes').m()

Demo: http://jsfiddle.net/ambiguous/bjPds/1/


4
constructor: (@s) ->Cũng sẽ hoạt động trong ví dụ thứ hai? (tức là, thay vì bài tập thủ công @s = s)
Tripp Lilley

1
@TrippLilley: Có, bạn có thể làm theo cách đó nếu muốn.
mu quá ngắn

Nhưng nếu chúng ta đặt các phương thức vào 'this', chúng sẽ không thực sự tĩnh nữa, phải không? Các phương thức tĩnh thực sự nên ở trong obj.prototype. Trong ví dụ về Shawn Mclean, chúng ta có thể gọi các phương thức như sau: Box2DUtility :: drawWorld (w, c);
Sergei Panfilov

1
@SergeyPanfilov: Nhưng bất cứ thứ gì trong nguyên mẫu cũng có sẵn this, đó chỉ là cách hoạt động của JavaScript nên bạn không thể làm gì với nó. Chúng ta cũng không thực sự có các lớp, chỉ có các đối tượng, nguyên mẫu và các hàm khởi tạo nên thuật ngữ này thậm chí còn bị nhầm lẫn hơn. Việc gắn các hàm làm thuộc tính của hàm khởi tạo (đó là những gì đang xảy ra ở đây) là phương thức tương đương gần nhất với một phương thức lớp mà chúng ta có. Kiểm tra JavaScript Box2DUtility::drawWorld sẽ không hoạt động.
mu quá ngắn

1
@ AlvaroLourenço Có vẻ như là một lớp CoffeeScript là một "khối tĩnh" (với một số công cụ bổ sung): jsfiddle.net/ambiguous/ap72ckax
mu quá ngắn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.