gpt4 book ai didi

javascript - 是否可以为 Node.JS 对象创建 "before writing"代理?

转载 作者:搜寻专家 更新时间:2023-10-31 23:45:10 27 4
gpt4 key购买 nike

给定一个对象:

var box = { number: 20 }

我想绑个“写前”Proxy (或等效)它。该代理将充当中间件并执行类型检查。

例如,在执行 box.number = "30" 之后,它会验证 typeof === "number"。如果不是,则会显示错误。

执行 box.number = 30 不会触发代理。


我尝试过的:

  • This .仅适用于未定义的属性。
  • Watcher.JS值被写入,然后中间件被执行(因为它是一个观察者)。中间件应首先执行。

我知道可以做什么:

  • 我知道我可以简单地事先检查变量的typeof。我正在寻找代理解决方案。
  • 自定义函数(getter 和 setter)。我想尝试使用代理,所有属性都有动态名称。

最佳答案

在我看来,考虑到您的需求,get/set 是一种更好的方法,它们的执行时间更快,代码更易于维护。

GETTERS/SETTERS 解决方案

自从 ES5 到来以来就...

  • A getter is a method that gets the value of a specific property.
  • A setter is a method that sets the value of a specific property.

You can define getters and setters on any predefined core object or user-defined object that supports the addition of new properties. The syntax for defining getters and setters uses the object literal syntax.

+信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects

var box = { 
_number : 0,
get number(){ return this._number },
set number(value){
/* your verifications here */
if( typeof value !== 'number' ) throw new Error('Invalid input')
/* if validates , asign value */
this._number = value;
}
}
// test...
box.number = "1234"; // FAIL
box.number = 1234; // OK
box.number; // output = 1234

代理解决方案

从 ES6 开始可用。如果性能对您很重要,则可能不合适。使用 GET/SET 代理陷阱,以获得与上一个示例相同的行为。

// your original object...
var box = {};
// create a proxy linked to your original object
var boxProxy = new Proxy( box , {
get( obj, prop, receiver ){ return obj[prop] },
set( obj, prop, value){
/* check if the property trying to be written is 'number' */
if( prop === 'number' ){
/* your verifications here */
if( typeof value !== 'number' ) throw new Error('Invalid input')
/* if validates , asign value */
this._number = value;
}
}
});
// test...
boxProxy.number = "1234"; // FAIL
boxProxy.number = 1234; // OK
boxProxy.number; // output = 1234

在这两种情况下,如果您需要私有(private)和隐藏属性 box._number,您可以使用 closures 实现它.

关于javascript - 是否可以为 Node.JS 对象创建 "before writing"代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48258383/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com