Ver Mensaje Individual
  #6 (permalink)  
Antiguo 15/02/2010, 21:41
Avatar de zerokilled
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: Eliminar prototypes

he tenido que releer y releer porque la verdad no lo estaba entendiendo, espero haber entendido bien el asunto. primero creo que deberias de leer acerca de como javascript busca los identificadores (identificadores son los nombres asignados a propiedades, funciones y variable), para tu caso, en un objeto. basicamente cuando intentas leer una propiedad, javascript primero busca si dicha propiedad existe explicitamente en dicho objeto. si no existe, javascript busca en la cadena de herencias comenzando por el prototype del constructor del objeto y continua por el resto de la cedena.

la razon por la que indexOf te sigue apareciendo cuando recorres el objeto con for/in es porque estas creando la propiedad indexOf con el valor null. entiendase que asignar un valor que literalmente no tiene un valor (como null y undefined, aunque ambos son distintos) no elimina explicitamente la propiedad sino que la sobreescribe con un nuevo valor o la crea. en tu caso, estas creando una propiedad explicitamente para el objeto. entonces, ¿como se elimina la funcion del objeto? para ello tenemos que usar el operador delete operand.
Código:
// para este ejemplo usare una funcion vacia con un nombre distinto porque;
// algunas implementaciones de javascript definen la funcion indexOf para arrays;
Array.prototype.myFunc = function(){ /*cuerpo vacio*/ };
var array = []; // se crea el array;
array.myFunc = undefined; // se crea la propiedad myFunc explicitamente en el objeto;
alert(array.myFunc); // muestra undefined, pues en la expresion anterior se ha creado dicha propiedad con ese valor;
delete array.myFunc; // se elimina la propiedad myFunc;
alert(array.myFunc); // muestra la funcion del prototipo Array porque en el objeto no existe dicha propiedad;
delete Array.prototype.myFunc; // se elimina la funcion desde el prototipo;
alert(array.myFunc); // muestra undefined porque no existe dicha propiedad en el objeto array ni en el prototipo del constructor;
ahora bien, entiendase que eliminar la funcion desde el prototipo afecta a todos los objetos creados. si lo que te interesa es eliminar la funcion solamente para algunos objetos en particular, entonces debes crear una propiedad con el mismo nombre y un valor distinto como undefined o null. en ese caso, javascript no alcanza a la funcion definida en el prototipo porque en el objeto existe una propiedad, independientemente del valor.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.