Мониторинг всех свойств объектов JavaScript (магические геттеры и сеттеры)

Как мне эмулировать магические геттеры / сеттеры __get () и __set () в стиле PHP в JavaScript? Многие говорят, что в настоящее время это невозможно. Я почти уверен, что это возможно, потому что такие проекты, как nowjs ( http://nowjs.com ), делают что-то подобное.

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

Пример того, что я хотел бы сделать:

var obj = {};
notify(obj, function(key, value) {
   //key is now the name of the property being set.
   //value is the value of the property about to be set
   console.log("setting " + key + " to " + value);
});
obj.foo = 2; //prints "setting foo to 2"
obj.bar = {a: 2}; //prints "setting bar to [Object]"
//Notice that notify() worked even though 'foo' and 'bar' weren't even defined yet!

(Вопрос аналогичен следующим вопросам :

)

РЕДАКТИРОВАТЬ: Похоже, эта функция называется «динамическими прокси» и должна появиться в стандарт ECMAScript "Harmony" (возможно, ES6). Вы можете прочитать больше здесь . Новый объект «Прокси» представлен парой методов (т.е. Create () и createFunction ()).

Это можно сделать:

//Constructing an object proxy (proto is optional)
var proxy = Proxy.create(handler, proto);
proxy.foo = 2; //Triggers 'set' function in the handler (read about it)

Итог: он не работает в большинстве браузеров, но является реализацией доступно для Node.js: node-proxy .

27
задан Community 23 May 2017 в 10:29
поделиться