从 ES6 类构造函数返回 ES6 Proxy

新手上路,请多包涵

我希望用户只为一个对象设置特定的属性,但同时该对象应该从自定义类构造。

例如

var row = new Row({
  name : 'John Doe',
  email : 'uhiwarale@gmail.com'
}, Schema);

row 可以有方法。但是当用户试图设置 row.password 时,他们是不允许的。

一种方法是使用 new Proxy 而不是 new Row 但是我们将放弃我们在 Row 类中做的所有很酷的事情。我想要 new Row 返回一个代理对象 this 引用作为代理的目标。

有人对此有任何想法吗?如果你知道 mongoosemongoose 是怎么做到的?

原文由 Uday Hiwarale 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 378
1 个回答

如果代理肯定会为您发生,限制设置功能的一种可能解决方案是返回一个 ES6 代理实例。

默认情况下,javascript 中的构造函数会自动返回 this 对象,但您可以通过在 this 上实例化代理来定义和返回自定义行为作为目标。请记住,proxy 中的 set 方法应该返回一个布尔值。

MDN :set 方法应该返回一个布尔值。返回 true 表示赋值成功。如果 set 方法返回 false,并且赋值发生在严格模式代码中,则会抛出 TypeError。

 class Row {
  constructor(entry) {
    // some stuff

    return new Proxy(this, {
      set(target, name, value) {
        let setables = ['name', 'email'];
        if (!setables.includes(name)) {
          throw new Error(`Cannot set the ${name} property`);
        } else {
          target[name] = value;
          return true;
        }
      }
    });
  }

  get name() {
    return this._name;
  }
  set name(name) {
    this._name = name.trim();
  }
  get email() {
    return this._email;
  }
  set email(email) {
    this._email = email.trim();
  }
}

所以,现在不允许根据代理设置不可设置的属性。

 let row = new Row({
  name : 'John Doe',
  email : 'john@doe.com'
});

row.password = 'blahblahblah'; // Error: Cannot set the password property

也可以在 get 方法上有自定义行为。

但是,请注意并注意覆盖返回到调用上下文的引用。

注意: 示例代码已经在 Node v8.1.3 和现代浏览器上进行了测试。

原文由 Vahid Hallaji 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏