如何在没有eval的情况下在coffeescript中调用New变量Class Name

时间:2013-05-21 12:40:59

标签: javascript jquery class coffeescript eval

所以,我有一个由子类扩展的标准类。在某些情况下,我通过jQuery传递要使用的子类,而不是使用默认的标准类。

实施例: jQuery('img').myPlugin();

呼叫

New mainClass(arg1, arg2)

虽然

jQuery('img').myPlugin({classToUse : 'myExtendedClass'});

呼叫

New myExtendedClass(arg1, arg2)

这里有适用的代码,但它在很多方面都很难看。我们怎么能这样做呢? @settings是一个简单的对象,@ settings.classToUse是一个传递的字符串。

@NewClass = eval("new #{@settings.classToUse}(this.$element, this.settings)")

以下内容不起作用并返回字符串错误:

@Framer = new @settings['classToUse'](this.$element, this.settings)

完整源代码的剪辑版本如下。逻辑中的任何错误都是剪切代码的结果,因为当前状态的代码具有100%的功能。

您还可以看到编译的代码here

class mainClass
  constructor: (@framedObject, @options) ->
  doSomething: ->
    alert('something')

class myExtendedClass extends mainClass
  doSomething: ->
    alert('somethingDifferent')

class anotherExtendedClass extends mainClass
  doSomething: ->
    super
    alert('Woah!')

$ ->
  $.plugin = (element, options) ->
    @settings = {classToUse : 'myExtendedClass'} #built by merging defaults and options
    @init = ->      
      @mainClass = eval("new #{@settings.classToUse}(this.$element, this.settings)")
    @init()
    this
  $.fn.mediaFrame = (options) ->
    return this.each ->
      plugin = new $.plugin this, options

2 个答案:

答案 0 :(得分:3)

如下:

class Border
  constructor: (@options) ->
class RedBorder extends Border
    constructor: (@options) ->
class BlueBorder extends Border
    constructor: (@options) ->

borders = 
  Default: Border
  Red: RedBorder
  Blue: BlueBorder

$.plugin = (element, options) ->
  @mainClass = new borders[@settings.class || 'Default'](@settings)

答案 1 :(得分:0)

您的第二种方法将失败,因为您无法实例化“字符串”

 @Framer = new @settings['classToUse'](this.$element, this.settings)

当你使用“type”而不是“classToUse”时似乎也有错误

最简单的方法似乎只是将class-object放入你给jQuery的哈希

 jQuery('img').myPlugin({classToUse : redBorder});

在此示例中,假设 redBorder 是类名。