Kelas dan metode statis dalam coffeescript


86

Saya ingin menulis kelas pembantu statis di coffeescript. Apakah ini mungkin?

kelas:

class Box2DUtility

  constructor: () ->

  drawWorld: (world, context) ->

menggunakan:

Box2DUtility.drawWorld(w,c);

Jawaban:


179

Anda dapat mendefinisikan metode kelas dengan mengawali mereka dengan @:

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

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

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

Dan jika Anda ingin Anda drawWorldbertindak seperti konstruktor maka Anda dapat mengatakan new @seperti ini:

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
Apakah constructor: (@s) ->juga akan berhasil pada contoh kedua? (yaitu, alih-alih tugas manual @s = s)
Tripp Lilley

1
@TrippLilley: Ya, Anda dapat melakukannya dengan cara itu jika Anda mau.
mu terlalu pendek tanggal

Tetapi jika kita menerapkan metode ke dalam 'ini', mereka tidak benar-benar statis lagi, bukan? Metode yang benar-benar statis harus tetap di obj.prototype. Dalam contoh Shawn Mclean kita dapat memanggil metode seperti ini: Box2DUtility :: drawWorld (w, c);
Sergei Panfilov

1
@SergeyPanfilov: Tapi apa pun di prototipe juga tersedia this, begitulah cara kerja JavaScript sehingga Anda tidak dapat berbuat apa-apa. Kami juga tidak benar-benar memiliki kelas, hanya objek, prototipe, dan fungsi konstruktor sehingga terminologinya semakin membingungkan. Melampirkan fungsi sebagai properti dari fungsi konstruktor (yang terjadi di sini) adalah yang paling mirip dengan metode kelas yang kita miliki. Periksa apakah JavaScript Box2DUtility::drawWorld tidak akan berfungsi.
mu terlalu pendek

1
@ AlvaroLourenço Tampaknya kelas CoffeeScript adalah "blok statis" (dengan beberapa hal tambahan): jsfiddle.net/ambiguous/ap72ckax
mu terlalu pendek
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.