如果代理肯定会发生,限制设置功能的一种可能的解决方案是返回一个 ES6 代理实例。
默认情况下,javascript 中的构造函数this
会自动返回对象,但您可以通过将代理实例化为目标来定义和返回自定义行为this
。请记住,代理中的 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 和现代浏览器上进行了测试。