如何在 Javascript 中获取计算出的 getter 名称?

How do I get the computed getter name in Javascript?

我有与此类似的代码:

class A {                                                            
    constructor() {
        this._a = 1;
    }

    get [val]() {
        if (val == 'a') {
             return this._a;
        }
    }
}

以上代码无效,因为val不存在。

我想从 getter 中获取 computed getter 名称并添加到变量 val,以便我知道正在访问什么 属性。

我怎样才能做到这一点?

您不能使用正常的 class 语法和 getters/setters 来做到这一点。问题是你只能定义 concrete getters.

为了定义拦截 all 调用的 getter,您需要使用 a Proxy

class A {
  constructor() {
    this._a = 1;
  }
}

const handler = {
  get: function(obj, prop) {
    if (prop == 'a') {
      return obj._a;
    }
    
    return `getting "${prop}" instead of "a"`;
  }
};


const instance = new A();
const p = new Proxy(instance, handler);

console.log(p.a);
console.log(p.b);
console.log(p._a);

如果你想 "hide" 某些字段,比如任何以下划线开头的字段,你可以这样做:

class A {
  constructor() {
    this._a = 1;
    this._b = 2;
    this._c = 3;
  }
}

const handler = {
  get: function(obj, prop) {
    const secretProp = `_${prop}`;
    //check if a property that starts with underscore is in the source object
    if (secretProp in obj) {
      return obj[secretProp];
    }
    
    return `getting "${prop}" is not allowed`;
  }
};


const instance = new A();
const p = new Proxy(instance, handler);

console.log(p.a);
console.log(p.b);
console.log(p.c);

console.log(p._a);
console.log(p._b);
console.log(p._c);

console.log(p.foo);

欢迎来到 Stack Overflow!

您正在寻找的是代理。这些代理不能由普通的 classes 扩展,但您可以确保您的 class 将自己实例化为代理。像这样

class A {
    constructor() {
        this._a = 1;
        return new Proxy(this, {
            get: (object, key, proxy) => {
                if (key == 'a') {
                   return object._a;
                }
            }
        });
    }
}
let someInstance = new A();
console.log(someInstance.a);