代理无法在扩展 class 中获取方法
Proxy cannot get method in extended class
我正在尝试使用 Proxy
,但我遇到了问题。我有一个 class 像这样:
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()
}
}
然后我像这样扩展 Model
:
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()
创建 class.
的实例
MyClass.getItems()
当我运行这个时,我得到错误:
TypeError: t.doSomething is not a function
其中 doSomething()
在 class ModelBase
内。如果我注释掉 Proxy
事情照常进行。所以,我想知道为什么我无法访问父 class.
您的代理正在尝试查找 target._items.doSomething
,但不存在。 target.doSomething
确实存在,但它不是在寻找那个。结果,它退回到返回 target
,这是整个对象。对象不是函数,因此是错误。
至于如何解决这个问题,这取决于您试图通过代理实现的目标。如果代理应该注意一组有限的属性,您可以明确检查这些属性。或者更一般地说,您可以检查 target[property]
是否存在,然后回退到 target._items[property]
,然后才回退到 target
。同样,这取决于您要实现的目标。
我正在尝试使用 Proxy
,但我遇到了问题。我有一个 class 像这样:
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()
}
}
然后我像这样扩展 Model
:
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()
创建 class.
MyClass.getItems()
当我运行这个时,我得到错误:
TypeError: t.doSomething is not a function
其中 doSomething()
在 class ModelBase
内。如果我注释掉 Proxy
事情照常进行。所以,我想知道为什么我无法访问父 class.
您的代理正在尝试查找 target._items.doSomething
,但不存在。 target.doSomething
确实存在,但它不是在寻找那个。结果,它退回到返回 target
,这是整个对象。对象不是函数,因此是错误。
至于如何解决这个问题,这取决于您试图通过代理实现的目标。如果代理应该注意一组有限的属性,您可以明确检查这些属性。或者更一般地说,您可以检查 target[property]
是否存在,然后回退到 target._items[property]
,然后才回退到 target
。同样,这取决于您要实现的目标。