是否可以在 JS 中重载对对象 属性 的访问
Is it possible to overload the access to an object's property in JS
我想为 JS 中的特定对象重载 "subscription"(python 术语,让我知道 JS 世界中是否有更好的词)操作。
正如您可以在 python 中重载 __getitem__ 方法一样,我想重载对 JS 对象属性的访问,例如,如果访问某些未设置的属性,则抛出自定义错误。
最后我想做同样的事情来做一个属性。
可能吗?如果是,如何?
PS :我发现 this 这很有趣,但只有当我知道我可以尝试获取的每个属性时它才会起作用,而我的情况并非如此。
您可以使用 proxies
做很多事情,但是如果您只想控制对 属性 的访问,您可以使用简单的 getters/setters。例如:
let obj = {
_prop: "Some value",
get prop() {
console.log("accessing prop")
return this._prop
},
set prop(value){
console.log("setting prop")
this._prop = value
}
}
console.log("value is: ", obj.prop)
obj.prop = "new value"
console.log("new value is: ", obj.prop)
你问的是元编程。你必须使用 Javascript Proxy
和 Reflect
api.
代理 api 接受一个目标对象和一个处理程序,在处理程序上定义的方法称为陷阱,每当您尝试访问对象的 key/property 时,陷阱首先被调用
const target = {
lang: "javascript"
}
const target_t = new Proxy( target, {
get() {// get trap},
set() { // set trap },
construct() { // trap }
...
});
创建 Proxy
的实例不会修改 target
、
const target_t = new Proxy( target, {
get(target,key,value) {
if ( key in target )
return Reflect.get(target,key);
throw new Error(`${key} does not exists in target`);
}
});
console.log(targe_t.lang); // javascript
console.log(target_t.lnag); // throws error
我想为 JS 中的特定对象重载 "subscription"(python 术语,让我知道 JS 世界中是否有更好的词)操作。
正如您可以在 python 中重载 __getitem__ 方法一样,我想重载对 JS 对象属性的访问,例如,如果访问某些未设置的属性,则抛出自定义错误。
最后我想做同样的事情来做一个属性。
可能吗?如果是,如何?
PS :我发现 this 这很有趣,但只有当我知道我可以尝试获取的每个属性时它才会起作用,而我的情况并非如此。
您可以使用 proxies
做很多事情,但是如果您只想控制对 属性 的访问,您可以使用简单的 getters/setters。例如:
let obj = {
_prop: "Some value",
get prop() {
console.log("accessing prop")
return this._prop
},
set prop(value){
console.log("setting prop")
this._prop = value
}
}
console.log("value is: ", obj.prop)
obj.prop = "new value"
console.log("new value is: ", obj.prop)
你问的是元编程。你必须使用 Javascript Proxy
和 Reflect
api.
代理 api 接受一个目标对象和一个处理程序,在处理程序上定义的方法称为陷阱,每当您尝试访问对象的 key/property 时,陷阱首先被调用
const target = {
lang: "javascript"
}
const target_t = new Proxy( target, {
get() {// get trap},
set() { // set trap },
construct() { // trap }
...
});
创建 Proxy
的实例不会修改 target
、
const target_t = new Proxy( target, {
get(target,key,value) {
if ( key in target )
return Reflect.get(target,key);
throw new Error(`${key} does not exists in target`);
}
});
console.log(targe_t.lang); // javascript
console.log(target_t.lnag); // throws error