function assert(assertion) { if (typeof assertion != "string") throw new Error("Invalid assertion."); let result = eval(assertion); if (!result) throw new Error("Bad assertion: " + assertion); } let calls = 0; let getSet = []; function resetTracking() { calls = 0; getSet = []; } let getSetProxyReplace = new Proxy( { replace: function(string, search, replaceWith) { calls++; return string.replace(search, replaceWith); } }, { get: function(o, k) { getSet.push(k); return o[k]; }, set: function(o, k, v) { getSet.push(k); o[k] = v; } }); resetTracking(); let replaceResult = getSetProxyReplace.replace("This is a test", / /g, "_"); assert('replaceResult == "This_is_a_test"'); assert('calls === 1') assert('getSet == "replace"'); resetTracking(); replaceResult = getSetProxyReplace.replace("This is a test", " ", "_"); assert('replaceResult == "This_is a test"'); assert('calls === 1') assert('getSet == "replace"');