簡體   English   中英

Coffeescript類返回元素傳遞給構造函數

[英]Coffeescript class return element passed into constructor

我正在重寫一個個人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元素或類的實例。

如果沒有瘋狂的黑客攻擊,這是否有可能?或者我應該采用其他方法,還是只保留它並堅持使用已有的技術?

不要以為“沒有瘋狂的破解”是可能的,因為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM