Foros del Web » Programando para Internet » Javascript »

Prototipos

Estas en el tema de Prototipos en el foro de Javascript en Foros del Web. Supongo que será algo muy simple, pero me he topado con esto y no lo entiendo. Hasta ahora cuando hacía un prototipo de una clase ...
  #1 (permalink)  
Antiguo 05/01/2011, 10:11
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 11 meses
Puntos: 310
Prototipos

Supongo que será algo muy simple, pero me he topado con esto y no lo entiendo. Hasta ahora cuando hacía un prototipo de una clase (Array, String, Number, ...), siempre lo había hecho con funciones, como esta:
Código Javascript:
Ver original
  1. Array.prototype.primero=function(){ return this[0]; }
  2. alert([1,2,3].primero()); // 1
Pero hoy me ha dado por guardarlo dentro de una variable, y me he dado cuenta de que no podía
Código Javascript:
Ver original
  1. Array.prototype.primero=(function(){ return this[0]; })()
  2. alert([1,2,3].primero); // undefined
¿Alguien me puede dar una solución, o por lo menos explicármelo?
Gracias :D
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #2 (permalink)  
Antiguo 05/01/2011, 11:02
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Prototipos

El problema es, ¿qué sentido tiene this en ese contexto?
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 05/01/2011, 14:16
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 11 meses
Puntos: 310
Respuesta: Prototipos

¿Y entonces cómo me refiero al array?
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #4 (permalink)  
Antiguo 05/01/2011, 14:40
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Prototipos

Que tal _cronos2, deberias tener en cuenta que es lo que estas haciendo en tu segundo ejemplo, ejecutas una funcion anonima y lo asignas a una propiedad de Array, el scope dentro de esa funcion tal cual lo estas planteando es window, lo podes probar:

Código Javascript:
Ver original
  1. window[0] = 'Prototype'
  2. Array.prototype.primero=(function(){ return this[0]; })()
  3. alert([1,2,3].primero); // Prototype

La forma correcta es como en tu primer ejemplo, si nos dijeras que es lo que tenes en mente talvés te podemos dar una idea de como conseguirlo.
  #5 (permalink)  
Antiguo 05/01/2011, 15:34
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 11 meses
Puntos: 310
Respuesta: Prototipos

Lo que estoy tratando de hacer es un innerHTML pero sólo de texto. Tengo esta función, que de momento no ha fallado, aunque tampoco he hecho muchas pruebas:
Código Javascript:
Ver original
  1. function getText(obj){
  2.  if(obj.value) return obj.value;
  3.  else{
  4.   var replaceNodes = [/<[a-z]+((\s+)([a-z]+)=("|')?(.+?)("|')?)*>/g, /<\/[a-z]+>(\n)?/g], str = obj.innerHTML;
  5.   str = str.replace(replaceNodes[0], '');
  6.   str = str.replace(replaceNodes[1], '');
  7.   return str;
  8. }
  9. }
Y lo que quería hacer era esto:
Código Javascript:
Ver original
  1. Object.prototype.innerText=(function(obj){
  2.  if(obj.value) return obj.value;
  3.  else{
  4.   var replaceNodes = [/(^\n)?<[a-z]+((\s+)([a-z]+)=("|')?(.+?)("|')?)*>/g, /<\/[a-z]+>(\n)?/g], str = obj.innerHTML;
  5.   str = str.replace(replaceNodes[0], '');
  6.   str = str.replace(replaceNodes[1], '');
  7.   return str;
  8. }
  9. })(this);
Pero devuelve undefined, así que la cuestión está en cómo referirme al object en vez de a window
Saludos (:
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #6 (permalink)  
Antiguo 05/01/2011, 16:05
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Prototipos

Seguramente me estoy perdiendo algo, pero cual es el problema con hacerlo asi ? :

Código Javascript:
Ver original
  1. Object.prototype.innerText = function() {          
  2.     if(this.value) return this.value;
  3.     ...
  4. }

Algo es seguro y es que si la función se ejecuta de forma automática innerText no va a ser un metodo de Object sino una propiedad y va a tener por valor el que se le asigna la primera vez(todos los objects van a tener en esa propiedad al momento de su creación el mismo valor, el que se asigno la primera vez).
  #7 (permalink)  
Antiguo 05/01/2011, 16:18
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 11 meses
Puntos: 310
Respuesta: Prototipos

Pero esque no quiero que sea un método, sino una propiedad, como lo es innerHTML, aunque si no hay más remedio tendré que hacerlo con un método.
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #8 (permalink)  
Antiguo 05/01/2011, 17:01
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Prototipos

Acá vuelvo, innerText es una propiedad en IE, y para FF podes hacer algo como esto:

Código Javascript:
Ver original
  1. HTMLElement.prototype.__defineGetter__("innerText",
  2.    function () { return(this.textContent); });  
  3. HTMLElement.prototype.__defineSetter__("innerText",
  4.    function (txt) { this.textContent = txt; });

Desconozco el alcance, habría que hacer los respectivos testeos para los diferentes navegadores y sus versiones.
  #9 (permalink)  
Antiguo 05/01/2011, 18:28
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 11 meses
Puntos: 310
Respuesta: Prototipos

He probado y tanto en FF como en Chrome funciona, falta Opera y mirar a ver cómo compatibilizo con IE. Muchas gracias!
PD: No sabía lo de HTMLElement, pero no me dejan darte más karma u.u'
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #10 (permalink)  
Antiguo 05/01/2011, 18:36
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Prototipos

Una vez mas quirksmode al rescate(busca innerText) :).

Etiquetas: prototipos
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 12:22.