ES6 деструктурирование с динамическими свойствами объекта - PullRequest
0 голосов
/ 04 октября 2019

Я хотел бы знать, возможно ли следующее с ES6.

У меня есть объект "o" с методом:

get(name) { 
}

, который возвращает некоторый другой объект в зависимости от предоставленногоname.

У меня есть еще один функциональный тест:: Это не работает - это то, что я хочу сделать

// here is what I'm trying to do
function test({db: get('db')}) {

}
// this is working
function test(o) {
  var db = o.get('db');
}

Я хочу, чтобы значение "db" было равно "o.get ('db'")». Я могу сделать это в теле функции, но мне интересно, возможно ли сделать его директива в определении аргумента.

Пока я могу использовать:

let [a, b, c] = [o.get('a'), o.get('b'), o.get('c')];

В качестве первой строки вфункция.

Спасибо

1 Ответ

3 голосов
/ 04 октября 2019

Вы можете использовать геттеры вместо общей функции get. Это позволит распаковать, а также упростит чтение остального кода:

let SomeObj = {
  get db() {
    return "this is db";
  }
}

function func({db}) {
  console.log('DB', db);
}

func(SomeObj);

Если ваши свойства динамичны, вы можете сделать ужасную вещь, как это:

let SomeObj = {
  get(name) {
    return `this is ${name}`;
  }
}

function func(o, {db = o.get('db'), blah = o.get('blah')} = {}) {
  console.log('DB', db);
  console.log('blah', blah);
}

func(SomeObj);

, но более реалистичным вариантом было бы иметь функцию, отображающую get на массив реквизитов:

let SomeObj = {
    get(name) {
        return `this is ${name}`;
    }
}

let extract = (obj, ...props) => props.map(p => obj.get(p));


function func(o) {
    let [db, blah] = extract(o, 'db', 'blah')

    console.log('DB', db);
    console.log('blah', blah);
}

func(SomeObj);

Наконец, вы можете обернуть свой объект в Proxy, чтобы получить динамический геттер, и в этом случае простое разрушение будет работать из коробки:

let SomeObj = new Proxy({}, {
    get(obj, name) {
      if(name in obj)
        return obj[name];
      return `this is ${name}`;
    }
});

function func({db, blah}) {
    console.log('DB', db);
    console.log('blah', blah);
}

func(SomeObj);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...