0

所以,我有一个由子类扩展的标准类。在某些情况下,我通过 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% 正常运行的。

您还可以在此处查看编译的代码。

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
4

2 回答 2

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)
于 2013-05-21T13:47:05.523 回答
0

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

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

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

最简单的方法似乎只是将类对象放入您提供给 jQuery 的散列中

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

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

于 2013-05-21T13:49:55.880 回答