2017-12-19 3 views
1

Ich versuche, eine Proxy zu verwenden, und ich habe Probleme. Ich habe eine Klasse wie folgt:Proxy kann keine Methode in der erweiterten Klasse

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() 
    } 

} 

ich dann Model erweitern wie so:

export class MyClass extends Model { 

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

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

} 

Dann rufe ich getItems(), die eine Instanz der Klasse erstellt.

MyClass.getItems() 

Als ich das laufen lasse, erhalte ich die Fehlermeldung:

TypeError: t.doSomething is not a function

Wo doSomething() innerhalb der Klasse ist ModelBase. Wenn ich die Proxy auskommentieren, funktionieren die Dinge wie immer. Also würde ich gerne wissen, warum ich nicht auf die Elternklasse zugreifen kann.

+0

'Klasse' ist ein Schlüsselwort; Ich bin mir nicht sicher, ob dies überhaupt mit dem Problem zu tun hat, aber ich würde Ihre Variable definitiv nicht "Klasse" nennen. – Jacob

+0

Ich benutze nicht 'class', es war nur ein Beispiel. Ich habe es jedoch umbenannt. –

+0

hat 'model' oder' modelBase' eine Eigenschaft '_items'? Und wenn ja, haben Items eine Methode, etwas zu tun? –

Antwort

2

Ihr Proxy versucht target._items.doSomething zu finden, aber das existiert nicht. target.doSomething existiert, aber es sucht nicht danach. Als Ergebnis fällt es auf target zurück, die das Objekt als Ganzes darstellt. Das Objekt ist keine Funktion und somit der Fehler.

Wie Sie dies beheben können, hängt davon ab, was Sie mit dem Proxy erreichen möchten. Wenn es eine begrenzte Anzahl von Eigenschaften gibt, auf die der Proxy achten sollte, könnten Sie diese explizit überprüfen. Oder allgemeiner können Sie prüfen, ob target[property] existiert, dann auf target._items[property] zurückgreifen und erst dann auf target zurückfallen. Auch hier kommt es darauf an, was Sie erreichen möchten.

+0

widerzuspiegeln Wenn ich die Datenbank abfrage, wird '_items' mit Schlüssel/Wert gefüllt, wobei' Schlüssel' der Name der Datenbankspalte und 'Wert' der Wert ist . –

+0

Sieht aus wie 'return target [property] || target._items [Eigenschaft] 'funktioniert. –

Verwandte Themen