Как получить вычисленное имя получателя в Javascript? - PullRequest
1 голос
/ 01 апреля 2020

У меня есть этот код, подобный следующему:

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

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

Указанный выше код недействителен, поскольку val не существует.

Я хочу получить computed getter имя из getter и добавьте к переменной val, чтобы я знал, к какому свойству обращаются.

Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

добро пожаловать в Stack Overflow!

То, что вы ищете, это прокси. Эти Прокси не могут быть расширены обычными классами, но вы можете убедиться, что ваш класс создает себя как Прокси вместо этого. Как это

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);
0 голосов
/ 01 апреля 2020

Вы не можете сделать это, используя обычный синтаксис класса и методы получения / установки. Проблема в том, что вы можете определить только конкретные получатели.

Чтобы определить получатель, который перехватывает все вызовы, вам необходимо использовать прокси

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);

Если вы хотите «скрыть» определенные поля, например, все, что начинается с подчеркивания, вы можете сделать что-то вроде:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...