그래서 표준 클래스가 하위 클래스로 확장되었습니다. 어떤 경우에는 기본 표준 클래스를 사용하는 대신 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)
A는 전체 소스 코드의 버전을 클립은 다음과 같습니다. 논리의 모든 오류는 현재 상태의 코드가 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
대부분 "그냥 새 국경"이라고하고 싶습니다. 자식 클래스를 사용하는 것은 특정 상황에서만 예외를위한 것입니다. 나는 이것을 포함하도록 내 질문을 업데이트했다. 객체의 모든 것을 고수하거나 if/else를 사용하는 것은'eval()'을 사용하는 것보다 훨씬 깔끔합니다. –
@AaronHarun 어떻게'eval()'보다 클리너가 아닌 객체를 사용하고 있습니까? 거기에 큰 그림이 보이지 않습니까? –
1) 코드 삽입을 위해 eval을 사용하지 않는 것이 좋습니다. 2) 명시 적으로 클래스를 해쉬에 넣어서 눈에 보이는 의존성을 구축하십시오. eval은 3 개월 만에 여러분을 포함한 누군가를 혼란에 빠지게 할 것입니다. – robkuz