2013-05-21 3 views
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)

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 

답변

3

어떻게 같은 약 :

당신이

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

사용중인으로도 오류가있을 것 같다 "문자열을"인스턴스화 어차피로 두 번째 접근 방식은 실패합니다

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) 
+0

대부분 "그냥 새 국경"이라고하고 싶습니다. 자식 클래스를 사용하는 것은 특정 상황에서만 예외를위한 것입니다. 나는 이것을 포함하도록 내 질문을 업데이트했다. 객체의 모든 것을 고수하거나 if/else를 사용하는 것은'eval()'을 사용하는 것보다 훨씬 깔끔합니다. –

+1

@AaronHarun 어떻게'eval()'보다 클리너가 아닌 객체를 사용하고 있습니까? 거기에 큰 그림이 보이지 않습니까? –

+0

1) 코드 삽입을 위해 eval을 사용하지 않는 것이 좋습니다. 2) 명시 적으로 클래스를 해쉬에 넣어서 눈에 보이는 의존성을 구축하십시오. eval은 3 개월 만에 여러분을 포함한 누군가를 혼란에 빠지게 할 것입니다. – robkuz

0

"classToUse"대신 "type"을 사용하십시오.

가장 쉬운 방법은 class-obj 요법이 redBorder 클래스 이름이라고 가정이 예에서는

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

jQuery를

에게 줄 해시에.

+0

'type'오타는 플러그인 외부에서 더 많은 의미를 갖도록 모든 코드를 빠르게 재 작성하는 것에서부터의 것입니다. 클래스 객체를 전달하는 것은 전역 적이 지 않기 때문에 작동하지 않습니다. –

+0

글쎄, 만약 당신이 그 클래스들을 글로벌하게 만들지 않는다면 어떻게 정확하게 평가 될 것인가? btw. "글로벌"이란 무엇을 의미합니까? 로컬 "네임 스페이스"에있는 클래스를 쉽게 정의 할 수 있습니다. – robkuz

관련 문제