Как добавить геттеры ко всем объектам - PullRequest
0 голосов
/ 13 января 2020

Как я могу добавить геттеры (или прототип / метод) ко всем объектам. У меня есть объект, который выглядит так:

foo.bar.text
//or
foo.bar.child.text

text - это массив строк, но мне нужна только одна из них. Каждый раз, когда я получаю это значение, я хочу получить только один фиксированный индекс (этот индекс сохраняется в другой переменной).

Итак, что мне нужно в результате:

foo.text = ['a','b'] 
foo.bar.text = ['c','d']
foo.bar.someChild.text = [null, undefined]
x = 1;

// here we make some magic

console.log(foo.text) // b
console.log(foo.bar.text) // d
console.log(foo.bar.someChild.text) // undefined

Так что, если какой-либо объект содержит массив text, если мы попытаемся получить его, мы получим не массив, а некоторый определенный элемент из него.

Вручную указать на элемент, который я не могу, поэтому foo.bar.text[x] не вариант. Имя массива и переменной, которые мы получаем, необязательно, например, мы можем сохранить массив в fullText и попробовать получить text. Как будто text = fullText[x].

Может кто-нибудь посоветовать, как я могу реализовать это, геттер, сеттер, прототип?

Обновление Похоже, прокси - мой вариант, спасибо за совет!

1 Ответ

0 голосов
/ 13 января 2020

Я бы посоветовал вам применить Proxy рекурсивно к объекту foo.

// the code is handwriting without test
var handler = {
  get: (target, prop) => {
    if (prop === 'text') {
       if (target[prop] instanceof Array) {
         return target[prop][x];
       } else {
         // dealing with non-array value
       }
    } else if (typeof target[prop] === 'object') {
       return new Proxy(target[prop], handler);
    } else {
       return target[prop];
    }
  }
}
var newFoo = new Proxy(foo, handler);
...