A ver, Andres1433. En javascript, cualquier función que se
enuncie posee un constructor, que es la propia función o (function), y un prototipo que es una referencia a sí misma. El constructor padre de cualquier función javascript es la función Function() cuyo constructor también es Function de forma indefinida.
Los constructores en Javascript son llamados a cada instancia o réplica de la misma función con
new, por lo que
Código Javascript
:
Ver originalfunction A(){
alert("instancia creada por la ejecución del constructor a su creación");
}
d = new A(); // emitirá un alert por haberse creado una instancia de A ya que a la creación se llamó al constructor, que es la misma función
sin embargo, esto no daría alert porque las propiedades sólo serían almacenadas en memoria, pero igualmente el constructor habría sido ejecutado, por lo que el
constructor de una función es un método de la clase u objeto, de ejecución automática a la hora de replicar.
Código Javascript
:
Ver originalfunction A(){
this.d = function(){alert("instancia creada por la ejecución del constructor a su creación");};
}
d = new A();
Un constructor y la propiedad constructor (funcion.constructor) no son lo mismo. Lo primero es una subrutina de inicialización que se ejecuta cuando se inicializa una función replicándola usando new y lo segundo es una propiedad que retorna la función que la creó.
Código Javascript
:
Ver originalfunction a(){
if(this.constructor == a){
alert("la instanciación se realizó copiando el objeto");
}
}
d = a() // no muestra alert
d = new a() // muestra alert
Por otro lado, un prototipo es una propiedad que ofrece una referencia al
contenido del objeto mismo.
Código Javascript
:
Ver originalfunction A(){ this.d="asd"; };
A.prototype // devuelve la propiedad d, el [I]prototype[/I] y el [I]constructor[/I] pero no [I]F()[/I] ni [I]{ [/I]y [I]}[/I]
sin embargo, A.prototype.constructor devuelve el constructor del prototipo del objeto F que sería ni más ni menos que la función sin el contenido
function A(){}
El constructor inicial de todas las funciones instanciadas finalmente es
Function, cuyo prototipo es
nada ya que a la hora de instanciar una Function creando una función su contenido inicial u original es nada hasta que se
rellena. Entonces, si se modifica el prototipo de Function añadiendo métodos o propiedades cualquier función creada en el documento ulteriormente contendrá tales métodos y propiedades.
Dado que prototype es el contenido de una función, hacer esto no tiene mucho sentido, porque la propiedad no existe como tal en el interior de la función, sino justo cuando se enuncia, ya que se crea después.
Código Javascript
:
Ver originalfunction F(){
this.prototype; // no existe
F.prototype; // es redundante
}
más bien existiría, desde un punto de vista imaginario en el siguiente ámbito o punto
(function F(){}).
prototype
que no es más que una propiedad que existe cuando el objeto terminó de
crearse, si se pudiera llamar así.
En resumen, suponiendo lo anterior:
F.prototype =
F.prototype.constructor = F(){}
F.constructor = function Function(){}
F.constructor.prototype = function Function(){}
.... Object
por lo que
Object.prototype.isPrototypeOf(Function) &&
Function.prototype.isPrototypeOf(F) // true
finalmente, una función es una invocación de Function que a su vez es un objeto de tipo function como puede verse
typeof Function == function || typeof F == function // true
y como juego se me ocurre que sería divertido hacer colapsar dos clases haciendose referencia mútuamente
Código Javascript
:
Ver originalfunction clase1(){
clase1.prototype=new clase2();
}
function clase2(){
clase2.prototype=new clase1();
}
clase1();
Lo cual genera un bucle infinito que genera error.
Espero que haya quedado mas o menos claro. Un saludo.