Я пытаюсь добиться этого в 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
понадобится.
Вы можете использовать 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
Извините, я сделал ошибку, взгляните на фрагмент сейчас; надеюсь, это то, что вы смотрите.
вы можете проверить фрагмент сейчас.: 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)
В современных браузерах вы можете добиться этого с помощью прокси:
Вот пример того, что вы описали:
const o = new Proxy({}, {
get(obj, name) {
return () => name
}
});
В конкретном случае у вас нет исходного объекта, который вы хотите "прокси", но вы, вероятно, захотите больше узнать о ссылке выше, чтобы добавить все ловушки, которые вы хотите.
MyObj
.