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