var access_log = ""; const handler = { get: function(obj, prop) { access_log += prop + ","; return prop in obj ? obj[prop] : ""; } }; class ProxiedGroupRegExp extends RegExp { exec(s) { var result = super.exec(s); if (result) { result.groups = new Proxy(result.groups, handler); } return result; } } let re = new ProxiedGroupRegExp("(?.)"); assertEq("a".replace(re, "$ $"), "a "); assertEq(access_log, "x,y,")