Javascript 从ES6类构造函数返回ES6代理

Javascript 从ES6类构造函数返回ES6代理,javascript,proxy,es6-class,es6-proxy,Javascript,Proxy,Es6 Class,Es6 Proxy,我希望用户只为一个对象设置特定的属性,但同时该对象应该从自定义类构造 比如说 var row = new Row({ name : 'John Doe', email : 'uhiwarale@gmail.com' }, Schema); 行可以有方法。但当用户试图设置行.密码时,它们是不允许的 一种方法是使用newproxy而不是newrow,但是这样我们就失去了在Row类中所做的所有很酷的事情。我希望新行返回一个代理对象,其中引用作为代理的目标 有人对此有什么想法吗?如果您知道mo

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

比如说

var row = new Row({
  name : 'John Doe',
  email : 'uhiwarale@gmail.com'
}, Schema);
可以有方法。但当用户试图设置
行.密码时,它们是不允许的

一种方法是使用
newproxy
而不是
newrow
,但是这样我们就失去了在
Row
类中所做的所有很酷的事情。我希望
新行
返回一个代理对象,其中
引用作为代理的目标


有人对此有什么想法吗?如果您知道
mongoose
,那么
mongoose
是如何做到这一点的?

您可以在根本不使用代理的情况下做到这一点

在类构造函数中,可以如下定义密码属性:

constructor(options, schema) {
    this.name = options.name;
    this.email = options.email;
    Object.defineProperty(this, 'password', {
        configurable: false, // no re-configuring this.password
        enumerable: true, // this.password should show up in Object.keys(this)
        value: options.password, // set the value to options.password
        writable: false // no changing the value with this.password = ...
    });
    // whatever else you want to do with the Schema
}

您可以在MDN的页面上找到有关如何使用此功能的更多信息。

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

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

:set方法应返回布尔值。返回true以指示 那项任务成功了。如果set方法返回false,则 赋值发生在严格模式代码中,将抛出TypeError

因此,现在不允许您根据代理设置不可设置的属性

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和现代浏览器上进行了测试。

您能更详细地描述一下您试图解决的问题吗?您似乎在描述一些可能的解决方案(使用代理),但没有真正描述您试图实现的目标。这非常有用:错误:“意外令牌新”?!我不认为你可以在构造函数中使用'new',而且它也不喜欢“returnproxy”?哇,这看起来很有效?!美好的在其他尝试中,构造函数似乎没有返回新的代理,所以感谢这个例子。@MasterJames不用担心。是的,它在节点v8.1.3上对我有效。从构造函数返回代理的一个潜在问题是,这限制了您的代码,就像用户受到限制一样,也就是说,您的业务逻辑无法在实例构造后设置或更新其他属性。解决这个问题的一种方法是使用一个方法来代理类本身,该方法包装并限制返回给用户的实例,但仍然允许您的代码访问底层实例。为什么类构造函数的mdn页()没有提到类构造函数可以返回对象?在哪里可以找到这种级别的信息?我的愿望是允许观察对象和数组属性操作符。这意味着任何未知的名称。在构造函数中返回代理使之成为可能,而按名称定义属性则不行。使用此方法,新定义的属性可以立即在类构造函数或方法中使用。另一方面,如果在类构造函数中返回代理对象,则代理的属性/方法仅在对象完全实例化后才可用。这是一个非常明显的限制,因为类构造函数或方法引用自身或将“This”关键字作为参数进行链接是非常常见的。
let row = new Row({
  name : 'John Doe',
  email : 'john@doe.com'
});

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