Estoy tratando de entender este código

Function.prototype.method = function (name, fn) {
    this.prototype[name] = fn;
    return this;
};

¿A qué se refiere "esto" en el cuerpo de la función? ¿Se refiere a Function.prototype? ¿Intenta agregar un miembro a Function.prototype.prototype, a saber, Function.prototype.prototype[name]?

3
user670800 21 jun. 2011 a las 06:54

3 respuestas

La mejor respuesta

Las funciones en Function.prototype se invocan en las instancias Function.
Por lo tanto, this se refiere a la función a la que lo llamó.

this.prototype se referiría al prototipo de la función a la que lo llamó.

Por ejemplo:

function MyClass() { }
MyClass.method("myMethod", function() { });

var c = new MyClass();
c.myMethod();    //MyClass.prototype.myMethod
9
SLaks 21 jun. 2011 a las 02:57
>     Function.prototype.method = function (name, fn) {
>         this.prototype[name] = fn;
>         return this;
>     };

Esto significa que las funciones heredan una propiedad method de Function.prototype . p.ej.

  function Foo(){}
  alert(typeof Foo.method); // function

Cuando se llama como Foo.method(), entonces dentro de la función método , this se referirá a Foo , por lo que:

  Foo.method('sayHi', function(){alert('hi');});

Crea una propiedad sayHi de Foo.prototype y le asigna un valor de la función proporcionada. Tenga en cuenta que Foo no hereda la función asignada por el método , solo los objetos creados por Foo (es decir, instancias de Foo ) tiene el método.

Notas

La llamada establece la palabra clave this de una función, por lo que si llama al método de alguna otra manera, probablemente se comportará mal:

  var c = { method: Foo.method };
  alert(typeof c.method); // function

  c.method('sayHi', function(){alert('hi');}); // this.prototype is undefined
2
Mostafa Mahmoud 24 dic. 2012 a las 16:54

"esto" se refiere a la nueva función que ha creado en el lado derecho de la instrucción de asignación.

2
Abeer Varan Dey 21 jun. 2011 a las 03:05