¿Por qué no funciona el Proxy de un objeto Map en ES2015?

Estoy ejecutando el siguiente script a través de la versión 57.0.2987.133 de Google Chrome:

var loggingProxyHandler = { "get" : function(targetObj, propName, receiverProxy) { let ret = Reflect.get(targetObj, propName, receiverProxy); console.log("get("+propName.toString()+"="+ret+")"); return ret; }, "set" : function(targetObj, propName, propValue, receiverProxy) { console.log("set("+propName.toString()+"="+propValue+")"); return Reflect.set(targetObj, propName, propValue, receiverProxy); } }; function onRunTest() { let m1 = new Map(); let p1 = new Proxy(m1, loggingProxyHandler); p1.set("a", "aval"); // Exception thrown from here } onRunTest(); 
 NOTE: Requires a browser supporting ES2015's Proxy 

Cuando se ejecuta, veo que se llama a la trampa de obtención del controlador para devolver la función de configuración del mapa y luego recibo el siguiente error:

 "Uncaught TypeError: Method Map.prototype.set called on incompatible receiver [object Object]" at Proxy.set (native) ... 

Traté de eliminar las funciones de captura de loggingProxyHandler (convirtiéndolo en un objeto vacío) pero todavía recibo el mismo error.

Según entendí, se suponía que se podía generar un objeto Proxy para todos los objetos JavaScript nativos ES5 y ES2015. Array parece funcionar bien bajo el mismo controlador de proxy. ¿Entendí mal las especificaciones?
¿Mi código falta algo? ¿Hay algún error conocido en Chrome? (Hice una búsqueda y no encontré defectos para Chrome en este tema).

El motivo por el que recibe el error es que el proxy no se está involucrando en la llamada p1.set (salvo que la captura set , no relacionada, a pesar del mismo nombre, recibe una llamada para recuperar la referencia de la función). Entonces, una vez que se ha recuperado la referencia de la función, se la llama con el proxy, no con el Map , que no le gusta a Map .

Si realmente está intentando interceptar todas las llamadas de acceso a propiedades en el Map , puede solucionarlo vinculando todas las referencias de función que está volviendo de get (consulte las líneas *** ):

 var loggingProxyHandler = { "get" : function(targetObj, propName, receiverProxy) { let ret = Reflect.get(targetObj, propName, receiverProxy); console.log("get("+propName.toString()+"="+ret+")"); if (typeof ret === "function") { // *** ret = ret.bind(targetObj); // *** } // *** return ret; }, "set" : function(targetObj, propName, propValue, receiverProxy) { console.log("set("+propName.toString()+"="+propValue+")"); return Reflect.set(targetObj, propName, propValue, receiverProxy); } }; function onRunTest() { let m1 = new Map(); let p1 = new Proxy(m1, loggingProxyHandler); p1.set("a", "aval"); console.log(p1.get("a")); // "aval" } onRunTest(); 
 NOTE: Requires a browser supporting ES2015's Proxy