В Javascript возможно ли создать объект с динамическими (неопределенными) свойствами / членами? - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь добиться этого в Javascript:

var a = new MyObj();
console.log(a.Foo()); // Print Foo
console.log(a["Bar"]()); // Print Bar

По сути, я заранее не знаю нужного имени свойства / члена, но зависит от вызова, который я возвращаю, немного похож наC # ExpandoObject (динамический).

Возможно ли создать такой объект в Javascript?

Примечание. Я знаю, что возможно добавить свойств, однако, в моем случае я заранее не знаю, что нужно добавить.

a.Foo = () => { return "Foo"; }

Это невозможно, потому что я не знаю, Foo понадобится.

Ответы [ 3 ]

0 голосов
/ 11 июня 2018

Извините, я сделал ошибку, взгляните на фрагмент;Надеюсь, это то, что вы ищете.

Вы можете проверить фрагмент сейчас.: D

let a = {}; // object
a.Foo = ()=> {return 'foo'};
a.Bar = ()=> {return 'bar'};

a.address = {}; // object inside object
a.address.houseno = '122';

console.log(a.Foo()); // Print Foo
console.log(a["Bar"]()); // Print Bar
console.log(a.address.houseno)
0 голосов
/ 11 июня 2018

Вы можете использовать Proxy и реализовывать только геттеры, возвращая функцию, которая является замыканием над клавишей.

var a = new Proxy({ baz: 42 }, {
        get: function (target, prop, receiver) {
            return prop in target
                ? () => target[prop]
                : () => prop;
        }
    });

console.log(a.Foo());    // Foo
console.log(a["Bar"]()); // Bar
console.log(a.baz());    // 42
0 голосов
/ 11 июня 2018

В современных браузерах вы можете добиться этого, используя Proxy :

Вот пример для достижения того, что вы описали:

const o = new Proxy({}, {
  get(obj, name) {
    return () => name
  }
});

В конкретном случае вы не 'у вас нет оригинального объекта, который вы хотите «прокси», но вы, вероятно, хотите прочитать больше по ссылке выше для добавления всех ловушек, которые вы хотите.

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