Foros del Web » Programando para Internet » Javascript »

Problema con propiedad "prototype"

Estas en el tema de Problema con propiedad "prototype" en el foro de Javascript en Foros del Web. Estoy realizando un pequeño trabajo en Javascript.Instancio un objeto de clase Categorie e indico que su objeto prototype es una instancia de PrototypeCategorie, el problema ...
  #1 (permalink)  
Antiguo 16/08/2012, 17:53
 
Fecha de Ingreso: octubre-2009
Mensajes: 9
Antigüedad: 14 años, 6 meses
Puntos: 0
Problema con propiedad "prototype"

Estoy realizando un pequeño trabajo en Javascript.Instancio un objeto de clase Categorie e indico que su objeto prototype es una instancia de PrototypeCategorie, el problema es que al hacer una llamada a un metodo de PrototypeCategorie no lo reconoce a menos que se haga una referencia a prototype. Por ejemplo.

Código:
function PrototypeCategorie (anId,aName)
{	
	this.content=document.createElement("P");
	this.content.innerHTML=aName;
	this.content.id=anId;
       
	this.getContent = function(){
	  return (this.content.innerHTML);
	};
	
}

function Categorie(anId,aName){

	this.prototype = new PrototypeCategorie(anId,aName);

       this.subCategories= new Array();

}

var c = new Categorie(1,"productos");

alert(""+ c.getContent() + ""); //-->Esto no funciona
alert(""+ c.prototype.getContent()+""); //--> esto si funciona
En teoria el interprete de javascript si no encuentra un atributo o metodo en el objeto va a buscarlo a prototype automaticamente siguiendo la cadena , por eso no entiendo porque no funciona.

Gracias
  #2 (permalink)  
Antiguo 16/08/2012, 18:16
 
Fecha de Ingreso: agosto-2012
Mensajes: 37
Antigüedad: 11 años, 8 meses
Puntos: 12
Respuesta: Problema con propiedad "prototype"

Creo que prototype funciona desde fuera de la función, por ejemplo:
Categorie.prototype=function(){...}
__________________
Pedro Gutiérrez, diseñador y desarrollador web freelance en Toledo,
busco soluciones a los proyectos web que me propongas.

Visita mi web-blog: http://xitrus.es
  #3 (permalink)  
Antiguo 16/08/2012, 18:21
 
Fecha de Ingreso: octubre-2009
Mensajes: 9
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Problema con propiedad "prototype"

No entendi que me quisiste decir :P
  #4 (permalink)  
Antiguo 16/08/2012, 18:48
Avatar de utan  
Fecha de Ingreso: agosto-2012
Mensajes: 126
Antigüedad: 11 años, 8 meses
Puntos: 17
Respuesta: Problema con propiedad "prototype"

hola,

Código Javascript:
Ver original
  1. this.prototype

estas instanciando la clase "PrototypeCategorie" en this.prototype no puedes llamarla directa sin la "propiedad" porque esta instaceada en esta y el metodo es parte de esta...

Necesitas llamar protoype para que puedas tener ese metodo disponible..
__________________
Mis conocimientos son limitado, pero si te puedo ayudar lo are gustoso mi chat particular, visitalo gracias http://rendezvouschat.com

Última edición por utan; 16/08/2012 a las 19:01
  #5 (permalink)  
Antiguo 16/08/2012, 19:17
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Problema con propiedad "prototype"

buenas,
un objeto no es quien posee la propiedad prototype, sino el constructor. en el código de ejemplo estás creando una propiedad con el nombre prototype para la nueva instancia. por tanto, lo que quisistes hacer fue lo siguiente:
Código:
function A(){}
function B(){
this.b = function(){ return 'b'; };
}
A.prototype = new B();

a = new A();
a.b(); // devuelve el string 'b';
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #6 (permalink)  
Antiguo 16/08/2012, 19:38
 
Fecha de Ingreso: octubre-2009
Mensajes: 9
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Problema con propiedad "prototype"

Muchas gracias por la respuesta zerokilled. A ver si me quedo claro , el A.prototype=new B() no puede estar dentro de function A(){} ya que la asignacion de la jerarquia es propia de la "clase" en sí , no del objeto instanciado (en este caso a) que genera la función constructora ¿o no?
  #7 (permalink)  
Antiguo 16/08/2012, 21:32
Avatar de dontexplain  
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 11 años, 10 meses
Puntos: 127
Respuesta: Problema con propiedad "prototype"

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 original
  1. function A(){
  2. alert("instancia creada por la ejecución del constructor a su creación");
  3. }
  4. 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 original
  1. function A(){
  2. this.d = function(){alert("instancia creada por la ejecución del constructor a su creación");};
  3. }
  4. 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 original
  1. function a(){
  2. if(this.constructor == a){
  3. alert("la instanciación se realizó copiando el objeto");
  4. }
  5. }
  6.  
  7. d = a()         // no muestra alert
  8. 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 original
  1. function A(){ this.d="asd"; };
  2. 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 original
  1. function F(){
  2. this.prototype; // no existe
  3. F.prototype; // es redundante
  4. }

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 original
  1. function clase1(){
  2. clase1.prototype=new clase2();
  3. }
  4.  
  5. function clase2(){
  6. clase2.prototype=new clase1();
  7. }
  8.  
  9. clase1();

Lo cual genera un bucle infinito que genera error.

Espero que haya quedado mas o menos claro. Un saludo.
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor

Última edición por dontexplain; 17/08/2012 a las 02:37

Etiquetas: funcion, html, propiedad
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:44.