Solo tengo curiosidad por saber si puedo incluir un objeto en la cadena de prototipos de funciones. Lo que quiero decir:

var test = function() { return 'a'; };

console.log(test.bind(this)); // return new bound function

// changing the prototype
// in console the prototype is really set as needed
// test => new object => function prototype => Object prototype
var F = function() {};
F.prototype = Function.prototype;
test.prototype = new F();

console.log(test.bind()); // this still works and returns new bound function

test.prototype.bind = function() {
    return 'test';
};

console.log(test.bind()); // this does not work as expected -> returns new bound function instead of 'test'. When I do delete Function.prototype.bind, then console.log(test.bind) returns undefined
3
arthur.borisow 15 may. 2012 a las 13:03
1
test.prototype.bind agrega un método a las instancias de test, es decir, new test().bind. No define test.bind. En su primer caso, test.bind se hereda directamente de Function.prototype, no de test.prototype.
 – 
Rob W
15 may. 2012 a las 13:07
Por lo que veo, es imposible agregar un método personalizado a la cadena de prototipos de funciones sin modificar el Function.prototype?
 – 
arthur.borisow
15 may. 2012 a las 13:11

1 respuesta

La mejor respuesta

Tienes una función test. Es un instanceof Function y hereda de Function.prototype para que pueda llamar a test.bind, por ejemplo.

Luego, estableces la propiedad "prototipo" de tu función en un objeto heredado de Function.prototype. Eso significa que todas las instancias de test heredarán de ese objeto (y de Function.prototype):

var t = new test;
t instanceof test; // => true
t instanceof Function; // => true

Luego, sobrescribe la propiedad de prueba en su objeto prototipo personalizado. Hace bien en hacerlo, porque los métodos de función solo deben llamarse en funciones (es decir, objetos invocables):

>>> Function.prototype.bind.call({})
Unhandled Error: Function.prototype.bind: this object not callable

En sus pruebas con console.log, solo aplica los métodos de función en su función test, no en instancias de ella. Bien, porque fallarían. Por lo tanto, no veo ninguna razón por la que ningún objeto deba heredar de Function; no se pueden construir funciones que no hereden directamente de Function.

2
Bergi 15 may. 2012 a las 15:21
Gracias por la explicación completa. En la medida en que no quiero extender el prototipo de función, estoy a punto de usar alguna clase de proxy, aunque no será tan elegante ... = (
 – 
arthur.borisow
15 may. 2012 a las 17:44