Coffeescript类返回元素传递给构造函数

时间:2014-12-08 11:26:50

标签: javascript html class coffeescript

我正在重写一个个人的coffeescript项目,尽可能多地使用类,只是为了lulz(也因为它有助于自动生成文档),而且我遇到了一些我可能无法写的东西。上课,想知道是否有人有解决方案,或者是否只是不可能。

我想采用一个html元素并添加一些自定义方法,类似于以下工作:

myelement = (element) ->
  element.method1 = ->
  element.method2 = ->
  element

raw = $('#something')[0]
out = myelement(raw)
expect(out).toBe(raw)
expect(out.method1).toBeDefined()

但正如我所说,我想把它写成一个类,就像这样:

class MyElement
  constructor: (element)
    #something funny here
  method1: ->
  method2: ->

raw = $('#something')[0]
out = new MyElement(raw)
expect(out).toBe(raw)
expect(out.method1).toBeDefined()

目标是能够将返回的对象视为html元素或我的类的实例。

这可能没有疯狂的黑客,或者我应该采取不同的方法,或者只是离开它并坚持我已经拥有的东西?

1 个答案:

答案 0 :(得分:1)

不要认为这是可能的,没有疯狂的黑客攻击'由于CoffeeScript不允许您更改@this)而无法编译,否则您可以执行以下操作:

class MyElement
  constructor: (element) ->
    element.test = 5
    @ = element

但你有一些选择可以考虑。首先,您可以封装修改后的对象并从方法返回它:

class MyElement
  constructor: (element) ->
    @myElement = element
    @myElement.test = 5
  get: =>
     @myElement

myElement = (new MyElement($('body')[0])).get()
console.log(myElement == $('body')[0])
console.log(myElement.test)

JsFiddle

或者你可以使用一些'手册'类实现:

MyElement = (->
  MyElement = (element) ->
    element.test = 5
    element
  MyElement
)()

myElement = (new MyElement($('body')[0]))
console.log(myElement == $('body')[0])
console.log(myElement.test)

JsFiddle 2