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]
起作用。