¡Esto es raro! Estoy luchando mucho con el problema de que la trampa de aplicación del controlador de Proxy de javascript no hace que el Proxy en sí pase como argumento, solo la función desnuda. Pero necesito pasar algunos metadatos para usarlos para volver a ajustar los resultados de la función.
Entonces pensé que podría usar Object.create para hacer una especialización de la función a la que podría agregar información adicional. ¡Pero eso no funciona! ¡Y eso es sorprendente!
function test() { return "hi!"; } test() // 'hi!' test1 = test // ƒ test() { return "hi!"; } test1() // 'hi!' test2 = Object.create(test) // Function {} test2() // Uncaught TypeError: test2 is not a function test3 = new Function([], "return 'lo!';") // ƒ anonymous() { return 'lo!'; } test3() // 'lo!' test2.prototype.constructor() // 'hi!' test3.prototype.constructor() // 'lo!' Object.getPrototypeOd(test2)() // 'hi!'Así que supongo que podría ayudarme a evaluar una función si la desenvolviera de alguna manera:
while(fn instanceof Function && typeof fn != 'function') fn = Object.getPrototypeOf(fn);Pero eso no funciona si solo quiero llamarlo, es decir, hacer que mi función especial sea transparente para cualquier usuario intermedio.
Bien, aquí hay una solución alternativa, en lugar de usar Object.create (fn), puedo envolverlo:
fn = function() { return fn.apply(this, arguments); }ahora puedo pegar mis metadatos especiales a este fn y también puedo envolverlo en un Proxy.
Pero mi pregunta es: ¿cuál es el significado de Object.create (fn) si no obtiene una función invocable real?
Respuesta corta: Function can be called; Object cannot be called.
Ver Función como herencia de Objeto. Las funciones son objeto pero los objetos no son función.
Mira esto:
function test() { return "hi!"; } test() // 'hi!' typeof test // 'function' test instanceof Object // true test2 = Object.create(test) typeof test2 // 'object' test2 instanceof Object // true typeof test2.prototype.constructor // 'function' // something else that works sample1 = Object.create({test}) typeof sample1 // 'object' typeof sample1.test // 'function' sample1.test() // 'hi!'Si insiste en hacer que un objeto sea invocable, tal vez su opción más cercana sea crear su propia clase que tenga un comportamiento de función. Hay algunas sugerencias aquí: ¿Puedes hacer que un objeto sea 'llamable'?