2009-04-15 20 views
7

Aprendí javascript cuando me encontré con el concepto de prototipo. Logré agregar nuevos métodos a la clase de cat, pero no se pudo anular el método original talk.La función del prototipo de JavaScript no anula la original

function cat(name) { 
    this.name = name; 
    this.talk = function() { 
     alert(this.name + " : I'm a girl!") 
    } 
} 

cat.prototype.talk = function() { 
    alert(this.name + " : I'm a dude!") 
} 

cat1 = new cat("felix") 
cat1.talk() 

¿Por qué esto no alerta al nuevo texto?

Respuesta

16

'function cat' es solo una función. Su prototipo es un Objeto vacío ({}). 'Nuevo gato' se puede llamar para agregar miembros 'nombre' y 'hablar' a un nuevo Objeto. Debajo de ese nuevo Objeto se encontrará el prototipo de la función, que sigue siendo {}.

var c= new cat('Tiddles'); 

c ownProperties: { 'name': 'Tiddles', 'talk': function() {...} } 
c inherited: {} 

Ahora, cuando se escribe a 'cat.prototype.talk', está añadiendo miembros a ese objeto que subyace:

c ownProperties: { 'name': 'Tiddles', 'talk': function() {...} } 
c inherited: { 'talk': function() {...} } 

La función 'hablar' situado en la misma instancia 'c' toma precedencia sobre la 'conversación' establecida indirectamente en el prototipo constructor de c.

Has mezclado dos estilos de herencia aquí, el método 'this'-assigning y el método' prototype '.

Escribir métodos para prototipos tiene la ventaja de que no se obtienen copias redundantes de los mismos miembros copiados en cada instancia de objeto; escribir en instancias tiene la ventaja de que resuelve el problema de los métodos enlazados. Cuál de ustedes elija depende de usted, pero no mezcle los dos. Si desea ir a la ruta del prototipo, solo debe escribirse 'nombre' en 'esto', porque esa es la única propiedad que es específica para cada instancia.

7

la función adjunta al principio se adjunta al objeto (1 función para cada instancia). el otro está unido al prototipo (1 función compartida por todas las instancias).

los miembros en el nivel de objeto anulan los del nivel de prototipo.

Cuestiones relacionadas