В Javascript возможно ли создать объект с динамическими (неопределенными) свойствами / членами?

1

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

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

В принципе, я не знаю заранее имя свойства/члена, которое необходимо, но зависит от вызывающего я возвращаю его, немного похожего на С# ExpandoObject (dynamic).

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

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

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

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

  • 0
    Да, это возможно. пожалуйста, добавьте MyObj .
  • 0
    да .... это будет Object.create (MYobjet)
Показать ещё 3 комментария
Теги:
object
dynamic

3 ответа

3
Лучший ответ

Вы можете использовать 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

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

вы можете проверить фрагмент сейчас.: 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
    Извините, это не то, что мне нужно (см. Пояснение, которое я добавил). Я не могу назначить каждое свойство, потому что я не знаю их.
  • 0
    @ LukeVo, это то, что вы ищете?
-2

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

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

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

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

  • 0
    Пожалуйста, избегайте ссылки только ответы . Ответы, которые «всего лишь ссылка на внешний сайт», могут быть удалены .
  • 0
    и я сижу здесь, удивляясь, почему я написал комментарий вместо ответа. наверное потому что это не ответ.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню