是否可以重载对JS中对象属性的访问

时间:2018-03-26 18:57:35

标签: javascript properties overloading getter-setter

我想重载JS中特定对象的“订阅”(python术语,让我知道JS世界中有一个更好的词)操作。

正如您可以在python中重载__getitem__方法一样,我想重载对JS对象属性的访问,例如,如果访问某些未设置的属性,则抛出自定义错误。

最终我想对属性的做法做同样的事情。

有可能吗?如果是,怎么样?

PS:我发现this很有意思,但只有当我知道我可以尝试获得的所有属性时它才有用,而且不是我的情况。

2 个答案:

答案 0 :(得分:1)

您可以使用proxies执行大量操作,但如果您只想控制属性的访问权限,则可以使用简单的getter / setter。例如:

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)

答案 1 :(得分:1)

你要问的是元编程。您必须使用Javascript ProxyReflect api。

代理api接受目标对象和处理程序,处理程序上定义的方法称为陷阱,每当您尝试访问对象的键/属性时,首先调用陷阱

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