Jestem nowy w CoffeeScript i lubię klasy CoffeeScript, ale nie mogę wypracować, jak je rozszerzyć w jQuery przy użyciu jQuery.prototype.

Dotyczy to części mojej aplikacji, która przechowuje globalne zmienne stanu, więc chcę je wywołać przez $.myThing.myFunction(), a nie zwykłe $.fn.extend / $( ).myThing() sposób rozszerzania.

Mogę sprawić, by działało w ten sposób:

$ = jQuery
$.myThing = $.myThing || {}

$.extend $.myThing, {
  myProperty: 0
  myFunction: ->
}

Co jest w porządku, ale nie mogę używać go jako klasy, a struktura nie wygląda ładnie w moim pycharmie. (Co, bycie szczerym prawdopodobnie przeszkadza bardziej niż cała klasa…)

Chcę zrobić coś takiego:

$ = jQuery
$.myThing = $.myThing || {}

class myThing
  myProperty: 0
  myFunction: ->

$.extend $.myThing, myThing()

Ale to nie działa (poza ładnym wyglądem w Pycharm). Czy jest na to lepszy sposób?

2
Adam Morris 7 marzec 2012, 14:47

2 odpowiedzi

Najlepsza odpowiedź

Czy to zadziała dla Ciebie?

class jQuery.myThing
  myProperty: 0
  myFunction: ->

Kompiluje się do:

jQuery.myThing = (function() {

  function myThing() {}

  myThing.prototype.myProperty = 0;

  myThing.prototype.myFunction = function() {};

  return myThing;

})();

Edytuj: $.myThing jako instancję klasy:

class myThing
  myProperty: 0
  myFunction: ->

jQuery.myThing = new myThing
2
Linus Thiel 7 marzec 2012, 15:34

Chciałem, aby moja metoda jquery działała jak zwykłe rozszerzenie jQuery — była obiektem jQuery, ze wszystkimi metodami jQuery, takimi jak each, html itd. — ale także posiadała właściwości mojej klasy. Oto moje rozwiązanie:

Object.prototype.extend = (klass)->
  for key, value of klass::
    @[key] = value

class MyClass
  myclassmethod: ->

$.fn.myjqextension = ()->
  @extend MyClass
  @myclassmethod()

Zobacz: https://github.com/jashkenas/coffee-script/issues/452

http://jimmycuadra.com/posts/coffeescript-classes-under-the-hood

0
Peter Ehrlich 13 wrzesień 2012, 23:13