【问题标题】:Proxy cannot get method in extended class代理无法获取扩展类中的方法
【发布时间】:2017-12-19 02:18:55
【问题描述】:

我正在尝试使用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 注释掉,一切都会照常进行。所以,我想知道为什么我不能访问父类。

【问题讨论】:

  • class 是关键字;我不确定这是否与问题有关,但我绝对不会称您的变量为class
  • 我实际上并没有使用class,这只是一个例子。不过我重命名了。
  • modelmodelBase_items 属性吗?如果是,_items 是否有 doSomething 方法?
  • ModelBase 同时拥有_itemsdoSomething
  • 请将其包含在您的示例中,因为从您引用的错误来看,它似乎有_items,但没有_items.doSomething。所以代理回退到返回目标(即整个对象),这不是一个函数。

标签: javascript typescript ecmascript-6 es6-proxy


【解决方案1】:

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

至于如何解决这个问题,这取决于您尝试使用代理实现的目标。如果代理应该注意一组有限的属性,您可以明确检查这些属性。或者更一般地,您可以检查target[property] 是否存在,然后回退到target._items[property],然后才回退到target。同样,这取决于您要达到的目标。

【讨论】:

  • 当我查询数据库时,_items 使用键/值填充,其中key 是数据库列名,value 是值。
  • 看起来return target[property] || target._items[property] 有效。
猜你喜欢
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多