【问题标题】:How to wrap object being constructed with Proxy inside constructor?如何在构造函数中包装使用代理构造的对象?
【发布时间】:2018-12-13 02:55:09
【问题描述】:

我了解Proxy 可用于更改对象级别的行为,例如括号表示法获取和设置。我能找到的所有示例都显示了构造一个对象,然后用Proxy 调用包装它。有没有办法使用 ES6 类构造函数表示法定义一个类 Foo,这样构造函数返回的对象已经包装在 Proxy 中,而不是构造函数的调用者也必须单独调用 Proxy

提前致谢。

【问题讨论】:

  • 是的,有,但你可能应该避免它。而是有一个工厂函数(可能是一个静态方法)来生成代理包装的实例。

标签: javascript ecmascript-6 es6-class es6-proxy


【解决方案1】:

如果我正确理解您的问题,您想要做的是在构造函数中返回一个新代理,如下所示:

class MyClass {
  constructor() {
    return new Proxy(this, {
      // Proxy settings here
    })
  }
}

在这个例子中,我们创建一个新类,然后调用一些属性。然后,代理将打印出为简单起见调用的属性。

class MyClass {
  constructor() {
    return new Proxy(this, {
      get: (target, key) => {
        console.log('I am the key: ' + key)
        return Reflect.get(target, key)
      }
    })
  }
}

let c = new MyClass
c.awesome
c.billy
c.superTroopers

if (c instanceof MyClass) {
  console.log('I am an instance of MyClass')
} else {
  console.log('I am not an instance of MyClass')
}

【讨论】:

  • 谢谢!它看起来像我最初寻找的东西。作为后续行动:这对instanceof 是否按预期工作,或者如果需要这种行为是否需要进一步摆弄?
  • 是的。如果你看到我的编辑,你会看到它打印出I am an instance
【解决方案2】:

据我所知:不,但您可以在之后设置prototype。像这样的:

class Thing {

    constructor() {
        // ...
    }

}

Thing.prototype = new Proxy(Thing.prototype, {

    get(target, name) {
        // ...
    }

});

【讨论】:

    猜你喜欢
    • 2011-12-18
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多