2017-12-19 8 views
1

Proxy을 사용하려고하는데 문제가 있습니다. 나는 다음과 같이 Model을 확장프록시가 확장 클래스에서 메서드를 가져올 수 없습니다.

export class Builder { 
    public doSomething(...args: (string | number | Raw | Object)[]): this { 
     // Do stuff 
     return this 
    } 
} 

export class ModelBase extends Builder { 
    protected _items = {} 
} 

export class Model extends ModelBase { 

    public constructor(options?: ModelSettings) { 
     super(options) 
     return new Proxy(this, { 
     get: function (target, property) { 
      return target._items[property] || target 
     } 
     }) 
    } 

    public static create() { 
     return new this() 
    } 

} 

: 나는 수업과 같이이

export class MyClass extends Model { 

    public constructor() { 
     super({/* Some options go here */}) 
     // Do some stuff 
    } 

    public static getItems() { 
     let t = this.create() 
     t.doSomething() 
    } 

} 

가 그럼 난 클래스의 인스턴스를 생성 getItems()를 호출합니다. 나는이 프로그램을 실행할 때

MyClass.getItems() 

, 나는 오류를 얻을 : doSomething() 클래스 ModelBase 내에

TypeError: t.doSomething is not a function

. 내가 Proxy 일을 평소와 같이 처리하는 경우. 그래서 부모 클래스에 액세스 할 수없는 이유를 알고 싶습니다.

+0

'class'는 키워드입니다. 이 문제에 전혀 관련이 있는지 잘 모르겠지만, 나는 확실히 귀하의 변수를'클래스'라고 부르지 않을 것입니다. – Jacob

+0

실제로'class'를 사용하지 않고 있습니다. 단지 예제 일뿐입니다. 나는 그것의 이름을 바꾸었다. –

+0

'model' 또는'modelBase'에'_items' 속성이 있습니까? 그렇다면 _items에는'doSomething' 메소드가 있습니까? –

답변

2

프록시가 target._items.doSomething을 찾으려고하지만 존재하지 않습니다. target.doSomething은 존재하지만 그걸 찾고 있지 않습니다. 결과적으로 전체 객체 인 target을 반환합니다. 객체는 함수가 아니므로 오류입니다.

이 문제를 해결하는 방법은 프록시를 사용하여 달성하려는 작업에 따라 다릅니다. 프록시가 주목해야하는 제한된 속성 집합이있는 경우 명시 적으로 확인할 수 있습니다. 또는 더 일반적으로 target[property]이 있는지 확인한 다음 target._items[property]으로 되돌아 가서 target으로 다시 폴백 할 수 있습니다. 다시 말하지만, 그것은 당신이 성취하고자하는 것에 달려 있습니다.

+0

데이터베이스를 쿼리 할 때,'_items'는 key/value를 사용하여 채워집니다. 여기서'key'는 db 컬럼 이름이고'value'는 값입니다 . –

+0

'return target [property] ||처럼 보입니다. target._items [property]'는 작동합니다. –