Javascript 代理无法在扩展类中获取方法

Javascript 代理无法在扩展类中获取方法,javascript,typescript,ecmascript-6,es6-proxy,Javascript,Typescript,Ecmascript 6,Es6 Proxy,我正在尝试使用代理,但遇到问题。我有一门课是这样的: export class Builder { public doSomething(...args: (string | number | Raw | Object)[]): this { // Do stuff return this } } export class ModelBase extends Builder { protected _items = {} } expor

我正在尝试使用
代理
,但遇到问题。我有一门课是这样的:

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()
当我运行此操作时,我会得到以下错误:

TypeError:t.doSomething不是一个函数


其中
doSomething()
在类
ModelBase
中。如果我把
代理注释掉
一切照常进行。因此,我想知道为什么我无法访问父类。

您的代理正在尝试查找
目标。_items.doSomething
,但这不存在<代码>目标。doSomething确实存在,但它不寻找它。结果,它返回到
target
,这是作为一个整体的对象。对象不是函数,因此是错误


至于如何解决这个问题,这取决于您试图通过代理实现什么。如果代理应该注意的属性集有限,则可以显式检查这些属性。或者更一般地说,您可以检查
target[property]
是否存在,然后返回到
target.\u items[property]
然后才返回到
target
。同样,这取决于你想要达到的目标。

class
是一个关键词;我不确定这是否与问题有关,但我绝对不会调用变量
class
。我实际上没有使用
class
,这只是一个示例。但是我重命名了它。
model
modelBase
是否有
\u items
属性?如果是这样的话,_items是否有
doSomething
方法?
ModelBase
既有
_items
又有
doSomething
请将其包括在示例中,因为从您引用的错误来看,它似乎有
_items
但没有
_items.doSomething>。因此代理返回目标(即,整个对象),这不是一个函数。当我查询数据库时,
\u items
使用key/value填充,其中
key
是db列名,
value
是值。看起来像
返回目标[property]| target.\u items[property]
起作用。