所以,我有一个由子类扩展的标准类。在某些情况下,我通过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
答案 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 是类名。