我正在尝试使用Proxy,但遇到了问题。我有一个像这样的课程:

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()创建类的实例。

MyClass.getItems()


运行此命令时,出现错误:


  TypeError:t.doSomething不是函数


其中doSomething()在类ModelBase中。如果我注释掉Proxy,一切照常。所以,我想知道为什么我不能访问父类。

最佳答案

您的代理正在尝试查找target._items.doSomething,但是不存在。 target.doSomething确实存在,但它不是要寻找的。结果,它回退到返回target,这是整个对象。对象不是函数,因此不是错误。

至于解决方法,这取决于您要使用代理实现的目标。如果代理应注意的属性有限,则可以显式检查这些属性。或更一般而言,您可能可以检查target[property]是否存在,然后退回到target._items[property],然后再退回到target。同样,这取决于您要实现的目标。

关于javascript - 代理无法获取扩展类中的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47879152/

10-16 15:49