2012-03-07 5 views
2

Я новичок в CoffeeScript, и мне нравятся классы CoffeeScript, но не могу решить, как их расширить в jQuery с помощью jQuery.prototype.Расширение jQuery с классом CoffeeScript

Это для части моего приложения, который содержит сортировки глобальных переменных состояния, поэтому я хочу, чтобы назвать это через $ .myThing.myFunction(), а не обычный $ .fn.extend/$() .myThing().

я могу заставить его работать так:

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

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

Что это нормально, но я не могу использовать его как класс, а структура не выглядит довольно мой PyCharm. (Который, будучи честным, вероятно, беспокоит больше всего класса вещь ...)

То, что я хочу, чтобы сделать что-то вроде этого:

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

class myThing 
    myProperty: 0 
    myFunction: -> 

$.extend $.myThing, myThing() 

Но это не работает (кроме глядя довольно в pycharm). Есть лучший способ сделать это?

ответ

2

Будет ли это работать на вас?

class jQuery.myThing 
    myProperty: 0 
    myFunction: -> 

компилирует:

jQuery.myThing = (function() { 

    function myThing() {} 

    myThing.prototype.myProperty = 0; 

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

    return myThing; 

})(); 

Edit:$.myThing как экземпляр класса:

class myThing 
    myProperty: 0 
    myFunction: -> 

jQuery.myThing = new myThing 
+0

Ближе - Я не смотрел на то, как классы компиляции. В этом случае $ .myThing возвращает прототип вместо одного экземпляра объекта, поэтому я предполагаю, что мне нужно добавить «новое» там где-то. –

+0

Я не знал, что вы хотите, чтобы '$ .myThing' был экземпляром класса. См. Править выше. –

+0

Не думаю, что я когда-либо понимал прототипы ... спасибо. Это прекрасно работает и даже выглядит красиво в pycharm. Кажется, я тоже могу сделать «$ .extend $ .myThing, новый myThing()». –

0

Я хотел, чтобы мой метод JQuery, чтобы действовать как обычный расширение JQuery - быть объектом jQuery, со всеми методами jQuery, такими как каждый, html и т. д., но также иметь свойства моего класса. Вот мое решение:

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

class MyClass 
    myclassmethod: -> 

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

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

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

Смежные вопросы