【问题标题】:Coffeescript class return element passed into constructorCoffeescript 类返回元素传递给构造函数
【发布时间】:2015-02-02 00:24:41
【问题描述】:

我正在重写一个个人 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 元素或我的类的实例。

这是否可能没有疯狂的黑客攻击,或者我应该采取不同的方法,还是放弃它并坚持我已经拥有的?

【问题讨论】:

标签: javascript html class coffeescript


【解决方案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

【讨论】:

  • 您的第二种方法实际上只是 OP 原始方法的复杂版本。只需将他的 myelement 函数重命名为 MyElement,您就可以实现完全相同的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 2022-01-12
  • 2014-06-04
  • 2018-05-09
  • 2023-03-27
相关资源
最近更新 更多