คลาสแบบคงที่และวิธีการในกาแฟ


86

ฉันต้องการเขียนคลาสผู้ช่วยแบบคงที่ในกาแฟ เป็นไปได้หรือไม่

ชั้น:

class Box2DUtility

  constructor: () ->

  drawWorld: (world, context) ->

ใช้:

Box2DUtility.drawWorld(w,c);

คำตอบ:


179

คุณสามารถกำหนดเมธอดคลาสโดยนำหน้าด้วย@:

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

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

การสาธิต: http://jsfiddle.net/ambiguous/5yPh7/

และถ้าคุณต้องการให้คุณdrawWorldทำตัวเหมือนตัวสร้างคุณสามารถพูดได้new @ดังนี้:

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

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

การสาธิต: http://jsfiddle.net/ambiguous/bjPds/1/


4
จะconstructor: (@s) ->ทำงานในตัวอย่างที่สองด้วยหรือไม่ (กล่าวคือแทนการกำหนดด้วยตนเอง@s = s)
Tripp Lilley

1
@TrippLilley: ใช่คุณสามารถทำแบบนั้นได้หากต้องการ
สั้นเกินไป

แต่ถ้าเราใส่วิธีการเป็น 'สิ่งนี้' มันจะไม่คงที่อีกต่อไปแล้วใช่ไหม วิธีการคงที่อย่างแท้จริงควรอยู่ใน obj.prototype ในตัวอย่างของ Shawn Mclean เราอาจเรียกวิธีการเช่นนี้ Box2DUtility :: drawWorld (w, c);
Sergei Panfilov

1
@SergeyPanfilov: แต่ทุกอย่างในต้นแบบก็มีให้ใช้งานได้thisเช่นกันนั่นเป็นเพียงวิธีการทำงานของ JavaScript ดังนั้นคุณจึงไม่สามารถทำอะไรได้เลย เราไม่มีคลาสทั้งอ็อบเจกต์ต้นแบบและฟังก์ชันคอนสตรัคเตอร์ดังนั้นคำศัพท์จึงสับสนมากขึ้น การแนบฟังก์ชันเป็นคุณสมบัติของฟังก์ชันตัวสร้าง (ซึ่งเป็นสิ่งที่เกิดขึ้นที่นี่) นั้นใกล้เคียงที่สุดกับเมธอดคลาสที่เรามี ตรวจสอบว่า JavaScript Box2DUtility::drawWorld ไม่ทำงาน
สั้นเกินไป

1
@ AlvaroLourençoดูเหมือนว่าคลาส CoffeeScript เป็น "บล็อกแบบคงที่" (มีบางอย่างเพิ่มเติม): jsfiddle.net/ambiguous/ap72ckax
สั้นเกินไป
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.