【问题标题】:Is it possible to overload the access to an object's property in JS [duplicate]是否可以重载对 JS 中对象属性的访问 [重复]
【发布时间】:2018-03-26 18:57:34
【问题描述】:

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

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

最终,我想对房产做同样的事情。

有可能吗?如果是,如何?

PS :我发现 this 很有趣,但只有当我知道我可以尝试获取的所有属性时它才会起作用,而这不是我的情况。

【问题讨论】:

  • 对于某些对象,是的;看看Proxies。如果“情感”是指分配,那么是的,set 陷阱就是这样做的。

标签: javascript properties overloading getter-setter


【解决方案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

【讨论】:

    【解决方案2】:

    你可以用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)

    【讨论】:

      猜你喜欢
      • 2014-10-08
      • 1970-01-01
      • 2019-02-04
      • 2012-09-29
      • 1970-01-01
      • 2018-10-18
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多